Opengl LWJGL-旋转矩阵会产生不必要的滚动

Opengl LWJGL-旋转矩阵会产生不必要的滚动,opengl,rotation,translation,lwjgl,vertex-shader,Opengl,Rotation,Translation,Lwjgl,Vertex Shader,我使用LWJGL、VAOs VBOs和GLSL着色器创建块世界。 我开始研究FreeFly相机,但我一直遇到麻烦 这是我旋转相机的方式: 在着色器中,这是我应用旋转和平移的方式: 由于某种原因,当我上下移动鼠标时,会产生轻微的滚动。。当我开始环游世界时,滚动加剧 我试着不绕Z轴旋转,但我仍然得到一个奇怪的滚动。这是没有意义的,当我注释掉Mat4f Z轴的旋转时,它仍然给我滚动,因为我从来没有围绕该轴旋转它。。。这就是为什么我认为我的移动和鼠标代码运行良好,问题出在其他地方 有人能找出我为什么会遇

我使用LWJGL、VAOs VBOs和GLSL着色器创建块世界。 我开始研究FreeFly相机,但我一直遇到麻烦

这是我旋转相机的方式:

在着色器中,这是我应用旋转和平移的方式:

由于某种原因,当我上下移动鼠标时,会产生轻微的滚动。。当我开始环游世界时,滚动加剧

我试着不绕Z轴旋转,但我仍然得到一个奇怪的滚动。这是没有意义的,当我注释掉Mat4f Z轴的旋转时,它仍然给我滚动,因为我从来没有围绕该轴旋转它。。。这就是为什么我认为我的移动和鼠标代码运行良好,问题出在其他地方


有人能找出我为什么会遇到这种奇怪的滚动问题吗?

OpenGl使用预乘来应用矩阵,而不是像你想象的那样发布。即,您设置的最后一个矩阵是将应用的第一个矩阵


您必须更改应用矩阵的顺序。

问题是我以错误的顺序旋转矩阵。
首先需要是俯仰,然后旋转偏航,否则,当偏航值不为0时,俯仰将转换为滚转而不是俯仰。

我必须将其更改为什么顺序?我已经尝试了各种方法,现在的方法是正确的。我先做投影,然后旋转,然后平移
    Matrix4f modelMatrix = new Matrix4f(); //ROTATION
    Matrix4f viewMatrix = new Matrix4f(); //TRANSLATION

     //ROTATE
    Matrix4f.rotate(this.degreesToRadians(game.getGameDisplay().getGameCamera().roll()), new Vector3f(0, 0, 1), 
            modelMatrix, modelMatrix); //ROTATE around Z
    Matrix4f.rotate((float) Math.toRadians(game.getGameDisplay().getGameCamera().yaw()), new Vector3f(0, 1, 0), 
            modelMatrix, modelMatrix); //ROTATE around Y
    Matrix4f.rotate((float) Math.toRadians(game.getGameDisplay().getGameCamera().pitch()), new Vector3f(1, 0, 0), 
            modelMatrix, modelMatrix); //ROTATE around X

    // Translate camera [*-1 because For some reason the world is inverted.. ill fix this later]
    Matrix4f.translate(new Vector3f(game.getGameDisplay().getGameCamera()
            .x()*-1, game.getGameDisplay().getGameCamera()
            .y()*-1, game.getGameDisplay().getGameCamera()
            .z()*-1), viewMatrix, viewMatrix); //TRANSLATE TO X Y Z
#version 150 core

uniform mat4 projectionMatrix; //PROJECTION
uniform mat4 viewMatrix; //TRANSLATION
uniform mat4 modelMatrix; //ROTATION

in vec4 in_Position;
in vec4 in_Color;
in vec3 in_TextureCoord;//NOT USED

out vec4 pass_Color;
out vec3 pass_TextureCoord;//NOT USED

void main(void) {
    gl_Position = in_Position;
    // Override gl_Position with our new calculated position
    gl_Position = projectionMatrix  * modelMatrix * viewMatrix * in_Position;

    pass_Color = in_Color;
    pass_TextureCoord = in_TextureCoord;
}