欧拉旋转应该存储为三个矩阵还是一个矩阵? 我试图在C++中创建一个简单的矩阵库,希望以后能够在游戏开发中使用。

欧拉旋转应该存储为三个矩阵还是一个矩阵? 我试图在C++中创建一个简单的矩阵库,希望以后能够在游戏开发中使用。,c++,matrix,rotation,euler-angles,C++,Matrix,Rotation,Euler Angles,我已经完成了基本的实现,但我刚刚意识到每个对象只存储一个矩阵的问题:旋转顺序会很快混淆 据我所知:AB!=BA 因此,如果我不断地将任意旋转乘以我的矩阵,那么旋转就会混淆,对吗?在我的例子中,我需要在Y轴上全局旋转,在X轴上局部旋转(也可以在Z轴上局部旋转)。这些似乎是一般第一人称射击运动员的素质。所以说“混合”,我的意思是,如果我在Y轴(或Z轴)上旋转,那么它将开始围绕局部X轴旋转,而不是预期的轴(如果有意义的话) 因此,我提出了以下解决方案: 保持3个Euler角度,当一个角度发生变化时,按

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

据我所知:AB!=BA

因此,如果我不断地将任意旋转乘以我的矩阵,那么旋转就会混淆,对吗?在我的例子中,我需要在Y轴上全局旋转,在X轴上局部旋转(也可以在Z轴上局部旋转)。这些似乎是一般第一人称射击运动员的素质。所以说“混合”,我的意思是,如果我在Y轴(或Z轴)上旋转,那么它将开始围绕局部X轴旋转,而不是预期的轴(如果有意义的话)

因此,我提出了以下解决方案:

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

  • 还是我什么都不担心?我的疑虑是错误的,秩序会以某种方式神奇地自行解决吗?

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

    你是对的,如果你有一个矩阵,并不断地在上面乘以一些东西,你最终会把事情搞砸。但是,我认为这不是你可能想走的路线


    我不知道您想要使用哪种图形系统,但使用OpenGL,您甚至不必担心矩阵表示(除非您正在做一些性能非常关键的事情),只需调用glRotate等即可。

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

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

    游戏开发中的一个常见答案是(1)中的内容:独立存储欧拉角,然后每次您想要获得对象在世界空间中的方向时

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

    我们也经常使用它作为一种更有效的存储和组合旋转的方法


    上面的每一个链接都应该带你去看一篇说明相关数学的文章。我也喜欢这本书,它很好地解释了整个主题。

    四元数不是也有我问题中描述的问题吗?或者这个问题仅仅是因为我坚持使用欧拉角?目前,我倾向于独立存储欧拉角,并希望得到最好的结果。@JamieSyme在局部轴上的旋转天生对顺序敏感。向左转90度然后向上看30度与向上看30度然后向左转90度是不同的(用模型飞机试试)。四元数帮助你的是,堆栈中只有一个旋转——你不单独存储俯仰/偏航/滚动,它只有一个轴和角度。但这不是一个自然的方式来考虑球员的运动,这就是为什么大多数人喜欢欧拉角。只要在你使用它们的顺序上保持一致。好吧,我想我现在明白了。我将把我的角度存储为欧拉角,因为它们暂时更容易理解。如果我碰巧遇到万向节锁,我会尝试采用“四元数”旋转方法,或类似的方法,并放弃我的欧拉角。谢谢:)@JamieSyme您仍然可以使用Euler角度来修改旋转(如果您真的愿意),没有什么可以阻止您沿着三个坐标轴一个接一个地旋转,但是您应该考虑另一种表示法来存储旋转并使用它们进行计算。矩阵或四元数是最自然的(如果不是我们人类,至少对计算机来说是这样,但无论如何我们不想用它们来计算)。谢谢你的回复!这实际上是我选择的方法(存储角度并在需要时构建矩阵)。我之所以选择Crashworks的答案是因为建议了其他方法,但我仍然非常感谢您的回答:)