我正在使用LWJGL(Java中的OpenGL)开展大学图形项目。我已经完成了大部分工作,但是在确定喷气机的方向时遇到了问题。
以下是我在一开始就尝试过的方法:(将其翻译成所需位置后)
GL11.glRotatef(xRotation, 1, 0, 0);
GL11.glRotatef(yRotation, 0, 1, 0);
然后我发现我遇到了万向节锁问题?例如:喷射辊向右旋转90度,然后向上倾斜,使其向右旋转。但如果我首先向上倾斜90度,然后以某个角度滚动,它看起来像是偏航!它仍然沿着原始的X轴旋转
滚动 - >球场看起来很好。
但是Pitch - > Roll看起来很糟糕。
然后我尝试了另一种方式:
GL11.glRotatef(xRotation, 1, 0, (float)Math.tan(Math.toRadians(-yRotation)));
GL11.glRotatef(yRotation, 0, 1, 0);
这次问题实际上反转了!我刚才描述的案例是颠倒的
滚动 - > Pitch看起来很糟糕。
但是Pitch - >滚动看起来很好。
我甚至无法想象当我将Yaw Rotation加入其中时会发生什么。
喷气机应该能够朝任何方向定向,而滚动,偏航,俯仰不应该相互干扰
我做了很多研究,在我看来,我必须将Roll-Pitch-Yaw 3旋转聚合成一个由 Quaternions 表示的旋转。但我真的很担心这个词。如果有人有做类似工作的经验,请给我一些提示(例子非常感谢!),我真的很沮丧。谢谢!
答案 0 :(得分:0)
您可以使用四元数但不需要。四元数只是表示旋转的另一种方式。如果需要,可以保留glRotatef
的矩阵表示。但是,我真的建议放弃这些弃用的方法。
您已经知道解决方案了。你需要积累旋转。因此,不要重置矩阵。如果您想左转,请致电
GL11.glRotatef(turnDegrees, 0, 1, 0);
一次,其中turnDegrees
是您要向左转的度数。就矩阵而言,这是:
ModelMatrix = ModelMatrix * RotationMatrixY(turnDegrees)
这将累积ModelMatrix
中的轮值,您不必担心转换顺序。