OpenGL ES Android странная проекция
Я пишу приложение в Android и использую OpenGL ES.
В моей тестовой сцене у меня есть куб и сфера. Сфера способна двигаться. Если Spehre находится в центре от дисплея, сфера отображается хорошо. Смотрите здесь. Но если я переместлю сферу к краю экрана, то текст будет искажен. Смотрите здесь. Я не знаю, откуда это взялось.
Вот мой 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;
}
все знают, откуда возникла моя проблема и как ее решить?
пожалуйста, дайте мне знать, если у вас достаточно информации. Вот две картины Мура о проблеме. pic3 и pic4
РЕДАКТИРОВАТЬ
Matrix.frustumM(mProjectionMatrix, 0, -ratio/2f, ratio/2f, -1f/2f, 1f/2f, 2, 100);
Но знайте, у меня есть эта проблема: Сфера вне Сетки