LWJGL旋转物体

时间:2014-10-18 22:10:48

标签: java opengl rotation lwjgl

我想让2个立方体以不同方式旋转。

设置旋转,我这样做。

GL11.glRotatef(rot[0], 1.0f, 0.0f, 0.0f);
GL11.glRotatef(rot[1], 0.0f, 1.0f, 0.0f);
GL11.glRotatef(rot[2], 0.0f, 0.0f, 1.0f);

我没有使用GL11.glLoadIdentity()重置旋转,而是在多维数据集类中执行类似的操作。

GL11.glRotatef(rot[0] * -1.0f, 1.0f, 0.0f, 0.0f);
GL11.glRotatef(rot[1] * -1.0f, 0.0f, 1.0f, 0.0f);
GL11.glRotatef(rot[2] * -1.0f, 0.0f, 0.0f, 1.0f);

这应该重置每个轴的旋转。

阵列"腐烂"保存x,y和z旋转,并通过立方体类中的这3个方法进行更新。

public void pitch(float angle) {
    rot[0] = angle;
}

public void yaw(float angle) {
    rot[1] = angle;
}

public void roll (float angle) {
    rot[2] = angle;
}

单独地,每个" GL11.glRotatef(等等等)和GL11.glRotatef(等* * -1.0f等等)"工作正常,但当他们在一起时,会发生奇怪的轮换。

我不确定这是与Gimbal Lock或我的代码有关,请帮忙。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您的反转代码似乎有误。请注意,矩阵乘法不是可交换的:

的倒数
R(x) * R(y) * R(z)

(与你的三个rotatef调用相似)是

R(-z) * R(-y) * R(-x)

。这意味着您必须更改调用第二个glRotatef命令的顺序。

答案 1 :(得分:0)

首先你应该停止使用旧的已弃用的固定功能管道

否则你想要的是这样的:

GL11.pushMatrix();
GL11.glRotatef(rot[0], 1.0f, 0.0f, 0.0f);
GL11.glRotatef(rot[1], 0.0f, 1.0f, 0.0f);
GL11.glRotatef(rot[2], 0.0f, 0.0f, 1.0f);

//render

GL11.popMatrix();

pushMatrix()保存当前矩阵,popMatrix()恢复最后保存的矩阵