• Create Account

### #Actualrejooh

Posted 03 April 2013 - 08:13 AM

Hello everyone,
I registered to get some help regarding a question relating camera rotation. Following multiple tutorials (LWJGL-Wiki MVP: http://www.lwjgl.org/wiki/index.php?title=The_Quad_with_Projection,_View_and_Model_matrices & OpenGL-Tutorial.org: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-6-keyboard-and-mouse/) I was able to create some cubes that are rendered with the use of model-, view- and projectionmatrices in Java 7 using LWJGL. Since this morning I am trying to implement camera movement and rotation. Everything seems to work fine, but with a closer look the camera (respectively the world) seems to translate when rotating.

Is that behavior normal or is something seriously wrong?

The following video shows what I am trying to describe:

Here is the code, that creates the matrices, Projection (with 45f, 1280f / 720f, 0.1f, 100f):
public static Matrix4f projectionMatrix(float fov, float aspect, float near, float far) {
float frustum = far - near;
float scaleY = (float)(1f / Math.tan(Math.toRadians(fov / 2f)));
float scaleX = scaleY / aspect;

Matrix4f result = new Matrix4f();
result.m00 = scaleX;
result.m11 = scaleY;
result.m22 = -((far + near) / frustum);
result.m23 = -1;
result.m32 = -((2 * near * far) / frustum);

return result;
}


View (eye is the cameras position, up is (0f, 1f, 0f):
public static Matrix4f lookAtMatrix(Vector3f eye, Vector3f target, Vector3f up) {
Vector3f zaxis = new Vector3f(
target.x - eye.x,
target.y - eye.y,
target.z - eye.z
);
zaxis.normalise();

Vector3f xaxis = new Vector3f();
Vector3f.cross(up, zaxis, xaxis);
xaxis.normalise();

Vector3f yaxis = new Vector3f();
Vector3f.cross(zaxis, xaxis, yaxis);

Matrix4f rotation = new Matrix4f();
rotation.m00 = xaxis.x;
rotation.m01 = yaxis.x;
rotation.m02 = zaxis.x;
rotation.m10 = xaxis.y;
rotation.m11 = yaxis.y;
rotation.m12 = zaxis.y;
rotation.m20 = xaxis.z;
rotation.m21 = yaxis.z;
rotation.m22 = zaxis.z;
rotation.m33 = 1;

Matrix4f translation = new Matrix4f();
translation.m00 = 1;
translation.m11 = 1;
translation.m22 = 1;
translation.m30 = -eye.x;
translation.m31 = -eye.y;
translation.m32 = -eye.z;
translation.m33 = 1;

Matrix4f result = new Matrix4f();
Matrix4f.mul(rotation, translation, result);

return result;
}


I calculate the target with the following code (position, yaw and pitch are attributes of the camera):
Vector3f target = new Vector3f(
);

The model matrices shouldn't be the problem.

The vertex shader calculates the MVP (but also shouldn't be the problem):
#version 330 core

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

in vec4 in_Position;
in vec4 in_Color;

out vec4 pass_Color;

void main(void) {
gl_Position = projectionMatrix * viewMatrix * modelMatrix  * in_Position;
pass_Color = in_Color;
}


Hope, someone is able to help me.
Thanks, rejooh.

### #1rejooh

Posted 02 April 2013 - 03:15 PM

Hello everyone,
I registered so could get some help regarding a question relating camera rotation. Following multiple tutorials (LWJGL-Wiki MVP: http://www.lwjgl.org/wiki/index.php?title=The_Quad_with_Projection,_View_and_Model_matrices & OpenGL-Tutorial.org: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-6-keyboard-and-mouse/) I was able to create some cubes that are rendered with the use of model-, view- and projectionmatrices in Java 7 using LWJGL. Since this morning I am trying to implement camera movement and rotation. Everything seems to work fine, but with a closer look the camera (respectively the world) seems to translate when rotating.

Is that behavior normal or is something seriously wrong?

The following video shows what I am trying to describe:

Here is the code, that creates the matrices, Projection (with 45f, 1280f / 720f, 0.1f, 100f):
public static Matrix4f projectionMatrix(float fov, float aspect, float near, float far) {
float frustum = far - near;
float scaleY = (float)(1f / Math.tan(Math.toRadians(fov / 2f)));
float scaleX = scaleY / aspect;

Matrix4f result = new Matrix4f();
result.m00 = scaleX;
result.m11 = scaleY;
result.m22 = -((far + near) / frustum);
result.m23 = -1;
result.m32 = -((2 * near * far) / frustum);

return result;
}


View (eye is the cameras position, up is (0f, 1f, 0f):
public static Matrix4f lookAtMatrix(Vector3f eye, Vector3f target, Vector3f up) {
Vector3f zaxis = new Vector3f(
target.x - eye.x,
target.y - eye.y,
target.z - eye.z
);
zaxis.normalise();

Vector3f xaxis = new Vector3f();
Vector3f.cross(up, zaxis, xaxis);
xaxis.normalise();

Vector3f yaxis = new Vector3f();
Vector3f.cross(zaxis, xaxis, yaxis);

Matrix4f rotation = new Matrix4f();
rotation.m00 = xaxis.x;
rotation.m01 = yaxis.x;
rotation.m02 = zaxis.x;
rotation.m10 = xaxis.y;
rotation.m11 = yaxis.y;
rotation.m12 = zaxis.y;
rotation.m20 = xaxis.z;
rotation.m21 = yaxis.z;
rotation.m22 = zaxis.z;
rotation.m33 = 1;

Matrix4f translation = new Matrix4f();
translation.m00 = 1;
translation.m11 = 1;
translation.m22 = 1;
translation.m30 = -eye.x;
translation.m31 = -eye.y;
translation.m32 = -eye.z;
translation.m33 = 1;

Matrix4f result = new Matrix4f();
Matrix4f.mul(rotation, translation, result);

return result;
}


I calculate the target with the following code (position, yaw and pitch are attributes of the camera):
Vector3f target = new Vector3f(
);

The model matrices shouldn't be the problem.

The vertex shader calculates the MVP (but also shouldn't be the problem):
#version 330 core

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

in vec4 in_Position;
in vec4 in_Color;

out vec4 pass_Color;

void main(void) {
gl_Position = projectionMatrix * viewMatrix * modelMatrix  * in_Position;
pass_Color = in_Color;
}


Hope, someone is able to help me.
Thanks, rejooh.

PARTNERS