如何在 OpenGL 中滚动、俯仰、偏航像飞行模拟器这样的对象?

How to roll,pitch,yaw an object like flight simulator in OpenGL?

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

下面是我一开始的尝试:(翻译到想要的位置后)

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

然后我发现我遇到了云台锁的问题?例如:喷气机向右旋转 90 度,然后向上倾斜,以便向右转弯。但是如果我先向上倾斜 90 度,然后以某个角度滚动,看起来就像是偏航!它仍然沿原来的X轴旋转。
Roll -> Pitch 看起来不错。
但是 Pitch -> Roll 看起来很糟糕。

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

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

这次的问题居然反过来了!我刚刚描述的情况是相反的。
Roll -> Pitch 看起来很糟糕。
但是 Pitch -> Roll 看起来不错。

我什至无法想象将 Yaw Rotation 添加到其中会发生什么。

喷气机应该能够在任何方向上定向,Roll、Yaw、Pitch 应该不会相互干扰

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

您可以使用四元数,但没有必要。四元数只是表示旋转的另一种方式。如果你愿意,你可以保留 glRotatef 的矩阵表示。但是,我真的建议放弃这些已弃用的方法。

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

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

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

ModelMatrix = ModelMatrix * RotationMatrixY(turnDegrees)

这将在 ModelMatrix 中累积旋转,您无需担心转换顺序。