I am calculating the model, view and projection matrices independently to be used in my shader as follows:
gl_Position = projection * view * model * vec4(in_Position, 1.0);
When I try to calculate my camera's view matrix the Z axis is flipped and my camera seems like it is looking backwards.
My program is written in C# using the OpenTK library.
I've created a test scene as follows:
From my understanding of the OpenGL coordinate system they are positioned correctly.
The model matrix is created using:
Matrix4 translation = Matrix4.CreateTranslation(modelPosition); Matrix4 model = translation;
The view matrix is created using:
Matrix4 translation = Matrix4.CreateTranslation(-cameraPosition); Matrix4 view = translation;
I now want to create the camera's rotation matrix. To do this I use the camera's right, up and forward vectors:
// Hard coded example orientation: // Normally calculated from up and forward // Similar to look-at camera. Vector3 r = Vector.UnitX; Vector3 u = Vector3.UnitY; Vector3 f = -Vector3.UnitZ; Matrix4 rot = new Matrix4( r.X, r.Y, r.Z, 0, u.X, u.Y, u.Z, 0, f.X, f.Y, f.Z, 0, 0.0f, 0.0f, 0.0f, 1.0f);
This results in the following matrix being created:
I know that multiplying by the identity matrix would produce no rotation. This is clearly not the identity matrix and therefore will apply some rotation.
I thought that because this is aligned with the OpenGL coordinate system is should produce no rotation. Is this the wrong way to calculate the rotation matrix?
I then create my view matrix as:
// OpenTK is row-major so the order of operations is reversed: Matrix4 view = translation * rot;
Rotation almost works now but the -Z/+Z axis has been flipped, with the green cube now appearing closer to the camera. It seems like the camera is looking backwards, especially if I move it around.
My goal is to store the position and orientation of all objects (including the camera) as:
Vector3 position; Vector3 up; Vector3 forward;
Apologies for writing such a long question and thank you in advance. I've tried following tutorials/guides from many sites but I keep ending up with something wrong.
Edit: Projection Matrix Set-up
Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView( (float)(0.5 * Math.PI), (float)display.Width / display.Height, 0.1f, 1000.0f);