使用矩阵,欧拉角和/或四元数进行旋转表示的优缺点是什么?

jes*_*tro 8 c c++ math directx linear-algebra

矩阵和欧拉角可能受到万向节锁的影响,但是使用一个而不是另一个的其他一些论点呢?

您认为DirectX有何看法?

你在日常的C++/C/DirectX编程中使用了什么?

Der*_*k E 12

欧拉角只需要三个参数,而不是存储矩阵(或三个,但听起来过多).但是,当您应用欧拉旋转时,您可能会得到相当于三个矩阵乘法的东西来创建变换.如果您只使用矩阵,则可能不会产生如此昂贵的成本(取决于矩阵的构造方式).除了Gimbal Lock之外,在插补旋转矩阵表示时还需要注意取消效果.

您可能想要考虑四元数.它们需要四个存储参数,因此它们不是很重.它们避免了万向节锁定,可以进行插值以实现平滑旋转.有一点可以解释为四元数的缺点是它们可能对某些人来说不太直观.矩阵变换和欧拉角有一种非常直观的滚转 - 俯仰或旋转 - 旋转 - 章动.四元数更类似于关于某个末端结果轴的单个旋转,以此方式或那种方式.

有些情况下,有人会更喜欢一种方法而不是其他方法,因此这些只是做出决定时需要考虑的一些事项.


phk*_*ler 7

欧拉角存在奇点并且难以使用。与这里的许多答案相反,矩阵表示没有这个问题。方向的矩阵表示可能会出现累积误差,因为您使用 9 个数字表示只有 3 个自由度的物体。四元数在数学上非常有趣,但最终它们实际上是在进行 4x4 矩阵乘法。

四元数也可以看作是表示旋转轴的 3vec,其长度与绕该轴的旋转角度(sin 平方?)有关。计算第四个参数以使 4vec 的长度等于 1。这种解释可以转换为等效的方向矩阵。

矩阵表示可以包括缩放信息,并且可以扩展到 4x4 以包括位置信息和方向。您可以使用矩阵变换来变换位置向量和方向向量,而使用其他两个变换则无法实现这一点。

使用 4x4 矩阵,您可以非常简单地完成大量的事情。四元数和欧拉角只是做方向。是的,就这么一件事。我想我在这个问题上的偏好/偏见相当明确:-)