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

问题描述 投票:0回答:2

我正在使用LWJGL,以及VAO,VBO和GLSL着色器来创建块世界。我开始在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轴的旋转时,它仍然为我提供了旋转,因为我从未绕过该轴旋转...(这就是为什么我假设我的运动和鼠标代码效果很好,问题出在其他地方)

有人能弄清楚为什么我遇到这个奇怪的问题吗?

opengl rotation translation lwjgl vertex-shader
2个回答
0
投票

问题是我在错误的订单中旋转矩阵。首先,它只需要是PITCH,然后旋转YAW,否则当YAW值不为0时,PITCH将转换为ROLL而不是PITCH。


-1
投票

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

您将不得不更改应用矩阵的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.