我正在使用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轴的旋转时,它仍然为我提供了旋转,因为我从未绕过该轴旋转...(这就是为什么我假设我的运动和鼠标代码效果很好,问题出在其他地方)
有人能弄清楚为什么我遇到这个奇怪的问题吗?
问题是我在错误的订单中旋转矩阵。首先,它只需要是PITCH,然后旋转YAW,否则当YAW值不为0时,PITCH将转换为ROLL而不是PITCH。
OpenGl使用预乘法来应用矩阵,而不是像您想象的那样发布。即您设置的最后一个矩阵是将要应用的第一个矩阵。
您将不得不更改应用矩阵的顺序。