Странная проекция OpenGL ES Android

Я пишу приложение на Android и использую OpenGL ES.

В моей тестовой сцене у меня есть куб и сфера. Сфера способна двигаться. Если сфера находится в центре экрана, сфера отрисовывается нормально Посмотреть здесь. Но если я передвигаю сферу к краю экрана, то сфера искажается Посмотреть здесь. Я не знаю, откуда это взялось.

Вот моя ProjectionMatrix:

public void onSurfaceChanged(GL10 unused, int width, int height) {

  // ...

  float ratio = (float) width / height;
  Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 1, 100);

  // ...
}

Мой расчет для ViewMatrix и TransformationMatrix:

public static Matrix4f createTransformationMatrix(Vector3f translation,
                                                  float rx, float ry, float rz, float scale){
    Matrix4f matrix4f = new Matrix4f();
    matrix4f.setIdentity();

    Matrix4f.translate(translation,matrix4f,matrix4f);

    Matrix4f.rotate((float) Math.toRadians(rx), new Vector3f(1,0,0), matrix4f,matrix4f);
    Matrix4f.rotate((float) Math.toRadians(ry), new Vector3f(0,1,0), matrix4f,matrix4f);
    Matrix4f.rotate((float) Math.toRadians(rz), new Vector3f(0,0,1), matrix4f,matrix4f);
    Matrix4f.scale(new Vector3f(scale,scale,scale),matrix4f,matrix4f);
    return matrix4f;
}

public static Matrix4f createViewMatrix(Camera camera) {
    Matrix4f viewMatrix = new Matrix4f();
    viewMatrix.setIdentity();
    Matrix4f.rotate((float) Math.toRadians(camera.getPitch()), new Vector3f(1, 0, 0), viewMatrix,viewMatrix);
    Matrix4f.rotate((float) Math.toRadians(camera.getYaw()), new Vector3f(0, 1, 0), viewMatrix, viewMatrix);
    Matrix4f.rotate((float) Math.toRadians(camera.getRoll()), new Vector3f(0, 0, 1), viewMatrix, viewMatrix);
    Vector3f cameraPos = camera.getPosition();
    Vector3f negativeCameraPos = new Vector3f(-cameraPos.x,-cameraPos.y,-cameraPos.z);
    Matrix4f.translate(negativeCameraPos, viewMatrix, viewMatrix);
    return viewMatrix;
}

И VertexShaderCode:

#version 300 es
//Vertex Shader
in vec3 position;
in vec2 textureCoords;
in vec3 normal;

out vec2 pass_textureCoords;
out vec3 surfaceNormal;
out vec3 toLightVector;
out vec3 toCameraVector;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition;

void main(void){

    vec4 worldPosition = transformationMatrix * 
    vec4(position.x,position.y,position.z,1.0);

    gl_Position  = projectionMatrix * viewMatrix * worldPosition;

    pass_textureCoords = textureCoords;

    surfaceNormal = (transformationMatrix * vec4(normal,0.0)).xyz;
    toLightVector = lightPosition - worldPosition.xyz;
    toCameraVector = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz - 
    worldPosition.xyz;
}

все ли знают, откуда взялась моя проблема и как ее решить?

пожалуйста, дайте мне знать, если у вас достаточно информации. Вот еще две фотографии о проблеме. рис3 и рис4

РЕДАКТИРОВАТЬ

Matrix.frustumM(mProjectionMatrix, 0, -ratio/2f, ratio/2f, -1f/2f, 1f/2f, 2, 100);

Но знайте, у меня есть эта проблема: Сфера вне сетки

Я не уверен, что сфера искажена неправильно. Я думаю, это может быть связано с тем, что вы настроили проекционную матрицу с очень широким полем зрения. frustumM делает установку поля зрения немного неявной. Вы можете попробовать уменьшить значения слева/справа/снизу/сверху или увеличить значение рядом. Я предлагаю вам начать с удвоения слова «рядом» и посмотреть, получится ли у вас менее искаженная проекция.

Columbo 01.03.2019 18:19

Отлично работает! Я увеличил рядом с 1 до 2 и разделил лево/право/снизу/сверху на 2. Но теперь у меня другая проблема. Сетка под сферой состоит из четырехугольников размером 1x1, и каждый ход продвигает четырехугольник сферы дальше, как в шахматах. Если я пройду 10 шагов, сфера окажется на линии сетки. Это даже из-за неправильной настройки проекционной матрицы?

Meeresgott 01.03.2019 18:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
80
0

Другие вопросы по теме