Hello again,
as a continuation of my previous thread where I fought with getting the models to actually render on the screen, I implemented the joml math library and conitnued on. Now I have a following case:
- In my scene I have a model of a dragon and a camera.
- I can rotate and move the dragon in any direction I want, and the forward vector of that model changes accordingly with the rotation.
- Then I have my camera that is defined by the viewMatrix to which I would like to apply the same actions as to that model.
- There are two problems with this:
- When I rotate, the forward vector diverges in the opposite direction to the direction of rotation. Ex. Lets assume that I start of facing in the X direction. My forward vector is also facing in the X direction. Then if I rotate my camera to face the Z direction, my forward vector is not Z but -Z. As the forward vector is calculated based on the rotation quaternion, and is correct for the dragon model, I believe the issue is with the viewMatrix (I should be facing in the -Z direction)
- Once I move the camera, any rotation that I apply to it is around the world origin and world axis. I know this is a trivial problem, however, I find it difficult to get this working as well.
- Those problems occur even though I apply exactly the same methods as I do for the dragon model.
I believe, the issue is not with the rotation methods or the forward vector calculation (although I found that the JOML function for this did not give me the desired results), but with my viewMatrix.
I define the viewMatrix as follows:
public static Matrix4f createViewMatrix(Camera camera)
{
Matrix4f viewMatrix = new Matrix4f();
Quaternionf rotation = new Quaternionf(camera.getTransform().GetRot());
Vector3f position = new Vector3f(camera.getTransform().GetPos());
position.mul(-1);
Vector3f up = new Vector3f(camera.getTransform().getUp());
Vector3f forward = new Vector3f(camera.getTransform().getForward());
Vector3f pos = new Vector3f(camera.getTransform().GetPos());
viewMatrix.rotate(rotation);
viewMatrix.translate(position);
return viewMatrix;
}
From my testing, I know that the up and forward vectors are calculating correctly.
Any insight would be greatly apprciated.
PS
In JOML there is a quaternion method for roate:
rotateAxis(angle, axis). I thought that in the axis I should input the new local axis (forward, up and right) however, through trial and error the dragon model works using world axis instead.