我正在使用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轴的旋转时,它仍然给我滚动,因为我从来没有围绕该轴旋转......(这就是为什么我假设我的运动和鼠标代码运作良好,问题出在其他地方)
有谁能弄清楚为什么我会遇到这个奇怪的滚动问题?
答案 0 :(得分:0)
所以简单地说我是个白痴。
问题是我在错误的顺序中旋转矩阵。 首先它需要PITCH才会旋转YAW,否则当你的YAW值不为0时,PITCH将转换为ROLL而不是PITCH。
答案 1 :(得分:-1)
OpenGl使用预乘来应用矩阵,而不是像你想象的那样发布。即您设置的最后一个矩阵是将要应用的第一个矩阵。
您必须更改应用矩阵的顺序。