OpenGL - Calculating camera view matrix
- by Karle
Problem
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.
Translation (Working)
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;
Rotation (Not-Working)
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);