我想让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或我的代码有关,请帮忙。
提前致谢。
答案 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()恢复最后保存的矩阵