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

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

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

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

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

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

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

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

有帮助吗?

解决方案

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

  1. 执行任何一种用欧拉角改变方向的过程都是不可能的。欧拉角受到奇点的影响 - 当其他角度经过奇点时,角度会瞬间变化180度;欧拉角几乎不可能用于顺序旋转。四元数不会遇到这些问题中的任何一个
  2. 有12种不同的可能的欧拉角旋转序列 - XYZ,XYX,XZY等。没有一个“最简单”的旋转序列。或“正确的”或欧拉角集。要获得一组欧拉角,您必须知道您正在使用哪个旋转序列并坚持使用它。
  3. 我建议您使用四元数执行所有存储和旋转操作,并且仅在需要输出时将四元数转换为欧拉角。执行此操作时,必须定义要使用的Euler旋转顺序。
  4. 我有所有这些操作的算法等等:往返于旋转矩阵(方向余弦矩阵)的任何旋转序列的欧拉角的四元数,在末端或中间点的四元数插值匹配位置,速率等,使用四元数的刚性和灵活的身体动力学和运动学。

    如果我能帮忙,请与我联系 nhughes1ster@gmail.com

其他提示

我是四元数的粉丝。为了使它们有效,您能否重新考虑您对用户的演示?您可以改为选择一些简单的3D对象并将四元数旋转应用于对象以直观地显示有效的旋转,而不是将旋转作为文本形式的一系列欧拉角呈现给用户。

为什么不在代码中使用Quaternions并在需要显示时将Q转换为天使?

您可以将旋转表示为轴+旋转角度,这与四元数(最多符号)基本相同

我认为在内部使用欧拉角是没有意义的 - 你会想要使用四元数进行所有计算,并且通常无法负担任何地方的转换费用。至于将它转换回UI的欧拉角度 - 如果用户只获得一个等于原始输入但是表示不同的角度,那会不会很糟糕?如果你做正确的转换,你最终应该得到“最简单”的转换。任何给定四元数的欧拉角。

我们谈论了多少次转化。看起来你要为每次转换支付大约两个超越操作,在现代硬件上可以达到每秒1亿的顺序。为了保存用户信息,我会同时存储Quaternions的精度和美学以及euler旋转。也许添加一个标志来指示哪个是任何给定对象的首选。最重要的是,您只需为每个轮换成员执行一次转换。一旦你计算了一个变换矩阵,它就会相乘,直到你的顶点用完为止。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top