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

时间:2014-08-05 17:55:58

标签: opengl rotation translation lwjgl vertex-shader

我正在使用LWJGL,使用VAO的VBO和GLSL着色器来创建一个Block世界。 我开始使用FreeFly相机并且遇到了麻烦。

这是我旋转相机的方式:

    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;
}

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

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

有谁能弄清楚为什么我会遇到这个奇怪的滚动问题?

2 个答案:

答案 0 :(得分:0)

所以简单地说我是个白痴。

问题是我在错误的顺序中旋转矩阵。 首先它需要PITCH才会旋转YAW,否则当你的YAW值不为0时,PITCH将转换为ROLL而不是PITCH。

答案 1 :(得分:-1)

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

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