欧拉旋转应该存储为三个矩阵还是一个矩阵?

问题描述 投票:3回答:2

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

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

据我所知:AB!= BA

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

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

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

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

c++ matrix rotation euler-angles
2个回答
4
投票

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

特别是如果你使用欧拉角,你可能会遇到gimbal lock的问题:假设你的第一次旋转是+ 90°正“俯仰”,这意味着你正向上看;然后,如果下一次旋转+ 45°“滚动”,那么你仍然只是直视。但是如果你以相反的顺序进行旋转,你最终会看到不同的地方。 (请参阅维基百科链接以获得更清晰的插图。)

游戏开发中的一个常见答案就是你所拥有的(1):独立存储欧拉角,然后每当你想要在世界空间中获得物体的方向时,就使用build the rotation matrix out of all three of them at once

另一个常见的解决方案是将旋转存储为an angle around a single axis,而不是欧拉角。 (对于动画师和玩家来说,这通常不太方便。)

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

上面的每个链接都会带您到一篇说明相关数学的文章。我也喜欢Eric Lengyel's Mathematics for 3D Game Programming and Computer Graphics书,它很好地解释了整个主题。


2
投票

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

你是对的,如果你有一个矩阵并且不断地将某些东西放到它上面,你最终会搞砸了。但同样,我不认为这是你可能想要采取的路线。

我不知道你想要使用什么样的图形系统,但是使用OpenGL,你甚至不用担心矩阵表示(除非你做的是超级性能关键的东西),并且可以简单地使用一些调用glRotate等。

© www.soinside.com 2019 - 2024. All rights reserved.