3

我正在尝试用 C++ 创建一个简单的矩阵库,希望以后能够在游戏开发中使用它。

我已经完成了基本的实现,但我刚刚意识到每个对象只存储一个矩阵的问题:旋转顺序会很快混淆。

据我所知:AB != BA

因此,如果我不断地将任意旋转乘以我的矩阵,那么旋转就会混淆,对吗?就我而言,我需要在 Y 轴上全局旋转,在 X 轴上局部旋转(在 Z 轴上局部旋转也不错)。这些似乎是普通第一人称射击游戏的品质。所以通过“混合”,我的意思是如果我在 Y 轴(或 Z 轴)上旋转,那么它将开始围绕局部 X 轴旋转,而不是预期的轴(如果这有任何意义)。

所以,这些是我想出的解决方案:

  1. 保留3个欧拉角,当一个角发生变化时,按照正确的顺序重建矩阵
  2. 保留3个矩阵,每个轴一个
  3. 在乘法过程中以某种方式破坏矩阵,然后正确地重建它(?)

还是我什么都不担心?我的疑虑是假的吗,订单会以某种方式神奇地自行解决?

4

2 回答 2

4

你是正确的,旋转矩阵的顺序在这里可能是一个问题。

特别是如果您使用欧拉角,您可能会遇到云台锁定的问题:假设您的第一次旋转是 +90° 正“俯仰”,这意味着您正在向上看;那么如果下一个旋转是+45°“滚动”,那么你仍然只是直视。但是如果你以相反的顺序进行旋转,你最终会看到完全不同的地方。(请参阅 Wikipedia 链接以获取更清楚的说明。)

游戏开发中的一个常见答案是您在 (1) 中得到的结果:独立存储欧拉角,然后每次您想要在世界空间中获取对象的方向时,一次从所有三个中构建旋转矩阵。

另一种常见的解决方案是将旋转存储为围绕单个轴的角度,而不是欧拉角。(这对于动画师和玩家动作来说通常不太方便。)

我们还经常使用四元数作为存储和组合旋转的更有效方式。

上面的每个链接都应将您带到说明相关数学的文章。我也喜欢Eric Lengyel 的3D 游戏编程和计算机图形学数学书,它很好地解释了整个主题。

于 2012-05-29T05:52:13.493 回答
2

我不知道其他人通常如何做到这一点,但我通常只是存储角度,然后在必要时重建一个矩阵。

你是对的,如果你有一个矩阵并不断地将一些东西乘以它,你最终会把事情搞砸。但同样,我认为这不是您可能想要采取的路线。

我不知道您要使用哪种图形系统,但是使用 OpenGL,您甚至不必担心矩阵表示(除非您正在做一些对性能至关重要的事情),并且可以简单地使用一些调用 glRotate 等。

于 2012-05-29T05:47:12.637 回答