如何在OpenGL中滚动、俯仰、偏航类似飞行模拟器的物体



我正在使用LWJGL(Java中的OpenGL)进行一个大学图形项目。我已经完成了大部分场景,但我在弄清楚飞机的方向时遇到了问题。

以下是我一开始是如何尝试的:(将其翻译到所需位置后)

        GL11.glRotatef(xRotation, 1, 0, 0);
        GL11.glRotatef(yRotation, 0, 1, 0);

然后我发现我遇到了万向节锁的问题?例如:喷气式飞机向右滚动90度,然后向上倾斜,使其右转。但如果我先投球90度,然后以某个角度滚动,看起来就像是亚翼!它仍然沿着原始X轴旋转
滚动->球场看起来不错
但是投球->滚看起来很糟糕

然后我尝试了另一种方法:

        GL11.glRotatef(xRotation, 1, 0, (float)Math.tan(Math.toRadians(-yRotation)));   
        GL11.glRotatef(yRotation, 0, 1, 0);

这一次问题居然反转了!我刚才描述的情况正好相反
翻滚->投球看起来很糟糕
但是投球->滚看起来不错

我甚至无法想象当我将"偏航旋转"添加到其中时会发生什么。

喷气式飞机应能够在任何方向上定向,滚转、偏航、俯仰不应相互干扰

我做了很多研究,在我看来,我必须将滚转-俯仰-偏航3旋转聚合为一个由四元数表示的旋转。但我真的很困惑这个词。如果有人有做类似工作的经验,请给我一些提示(非常感谢例子!),我真的很沮丧。非常感谢。

可以使用四元数,但不需要。四元数只是表示旋转的另一种方式。如果需要,可以保留glRotatef的矩阵表示。然而,我真的建议放弃这些不推荐使用的方法。

你已经知道解决方案了。你需要积累旋转。因此,不要重置矩阵。如果你想左转,请拨打

 GL11.glRotatef(turnDegrees, 0, 1, 0);

一次,其中turnDegrees是要左转的度数。就矩阵而言,这是:

ModelMatrix = ModelMatrix * RotationMatrixY(turnDegrees)

这将累积ModelMatrix中的旋转,并且不需要担心变换顺序。

最新更新