我正在尝试用C ++创建一个简单的矩阵库,我希望以后可以在游戏开发中使用它。
我完成了基本的实现,但是我刚刚意识到每个对象只存储一个矩阵的问题:旋转顺序会很快混淆。
据我所知:AB!= BA
因此,如果我不断将任意旋转乘以我的矩阵,那么旋转会混淆,对吗?在我的例子中,我需要在Y轴上全局旋转,在X轴上局部旋转(在Z轴上局部旋转也很好)。这些看起来像普通第一人称射击游戏的特质。因此,通过“混合”,我的意思是,如果我在Y轴(或Z轴)上旋转,那么它将开始围绕局部X轴旋转,而不是预期的轴(如果这有意义的话)。< / p>
所以,这些是我提出的解决方案:
还是我什么都不担心?我的疑虑是否错误,订单会以某种方式神奇地解决自己?
答案 0 :(得分: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本书,它很好地解释了整个主题。
答案 1 :(得分:2)
我不知道其他人通常如何做到这一点,但我通常只存储角度,然后在必要时重建矩阵。
你是对的,如果你有一个矩阵并且不断地将某些东西放到它上面,你最终会搞砸了。但同样,我认为这不是你想要采取的路线。
我不知道你想要使用什么样的图形系统,但是使用OpenGL,你甚至不必担心矩阵表示(除非你做的是超级性能关键的东西),并且可以只需使用一些调用glRotate之类的东西。