欧拉角与四元数 - 由内部存储和呈现给用户之间的张力引起的问题?

Wil*_*ker 11 3d user-interface animation quaternions euler-angles

四元数可以说是在内部表示对象旋转的合适选择.它们简单有效地插入并明确表示单个方向.

但是,在用户界面中显示四元数通常是不合适的 - 欧拉角通常对用户来说更为熟悉,并且它们的值更直观和可预测.

欧拉角在代码级别上变得复杂 - 它们需要存储旋转顺序,并且使用该顺序和相关联的角度组成实际方向(无论是矩阵还是四元数)是麻烦的,至少可以说是麻烦的.

使用四元数表示最方便地执行可靠的插值 - 这是否意味着我们必须在Euler表示和四元数表示之间不断转换?这在绩效方面是否可行?

我们可以将方向存储为四元数并将它们转换为仅显示给用户吗?这可能是不可能的,因为对于任何给定的方向,只有一个四元数表示,但有许多欧拉表示.我们如何"选择"与最初定义该方向的Euler表示相对应的Euler表示?这似乎是一项不可能完成的任务 - 我们在转换为四元数时已经有效地丢失了信息.

我们可以存储为欧拉角,然后根据需要转换为四元数吗?这可能是不可扩展的 - 从欧拉角到四元数的转换,插值,然后再转换回来可能是相对昂贵的代码.

我们可以简单地存储两种表示并使用最适合任何给定情况的表示吗?在存储器方面的大量成本(想象具有大约60个骨骼的骨架的动画曲线)并保持这些值同步可能是昂贵的,或者至少是麻烦的.

有没有人看到,使用或者解决这个问题的任何聪明的解决方案?当然上面的三个选项不仅仅是一个吗?是否有任何其他的问题领域类似这样已经解决了吗?

小智 18

我是航空航天工程师; 三十年来,我一直在使用四元数进行航天器姿态控制和导航.以下是您对情况的一些看法:

  1. 执行任何一种用欧拉角改变方向的过程都是不可能的.欧拉角受到奇点的影响 - 当其他角度经过奇点时,角度会瞬间变化180度; 欧拉角几乎不可能用于顺序旋转.四元数不会遇到这些问题
  2. 有12种不同的可能的欧拉角旋转序列 - XYZ,XYX,XZY等.没有一个"最简单"或"右"的欧拉角集.要获得一组欧拉角,您必须知道正在使用哪个旋转序列并坚持使用它.
  3. 我建议您使用四元数执行所有存储和旋转操作,并仅在需要输出时将四元数转换为欧拉角.执行此操作时,必须定义要使用的Euler旋转顺序.

我有所有这些操作的算法等等:往返于旋转矩阵(方向余弦矩阵)的任何旋转序列的欧拉角的四元数,在末端或中间点的四元数插值匹配位置,速率等,刚性和灵活性使用四元数的身体动力学和运动学.

如果我能在nhughes1ster@gmail.com提供帮助,请与我联系

  • 接受这个答案,因为它似乎拥有最多的选票。然而,1)是的,不幸的是我在动画领域工作,艺术家希望有欧拉角 2)是的,动画师再次希望能够在他们的骨骼上任意设置旋转顺序,所以我必须支持所有排列 3 )这或多或少是我最终在做的事情。 (2认同)