为什么四元数用于旋转?

我是一名物理学家,并且一直在学习一些编程,并且遇到了很多使用四元数进行旋转的人,而不是用矩阵/矢量形式写东西。

在物理学中,我们没有使用四元数有很好的理由(尽管偶尔讲述关于汉密尔顿/吉布斯等的奇怪故事)。 物理学要求我们的描述具有良好的分析行为(这有一个精确定义的含义,但在某些技术方面远远超出了正常介绍类教导的内容,所以我不会详细讨论)。 事实证明,四元数没有这种好的行为,所以它们没有用,矢量/矩阵就这么做,所以我们使用它们。

然而,限于刚性旋转和不使用任何分析结构的描述,三维旋转可以以任何方式(或几种其他方式)等效描述。

通常,我们只需要一个点X =(x,y,z)到一个新的点X'=(x',y',z')的映射,受到X2 = X'2的限制。 有很多事情都是这样做的。

幼稚的方法是画出这个定义的三角形并使用三角函数,或者使用点(x,y,z)和向量(x,y,z)之间的同构以及函数f(X)= X'和(x,y,z)T(a,b,c)(x',y',...)的矩阵MX = X',或者使用四元数,或者沿着新的矢量投影出旧矢量的分量。 z')等。

从数学的角度来看,这些描述在这种情况下是等价的(作为一个定理)。 他们都有相同数量的自由度,相同数量的约束条件等。

那么,为什么四元数似乎优于矢量?

我看到的常见原因是没有万向节锁或数字问题。

没有万向节锁定的说法似乎很奇怪,因为这只是一个欧拉角度的问题。 它也仅仅是一个坐标问题(就像极坐标系中r = 0处的奇点(雅可比行列式)),这意味着它只是一个局部问题,可以通过切换坐标,旋转退化,或使用两个重叠的坐标系。

我对数字问题不太确定,因为我不清楚这些(以及其他方式)如何实施。 我读过重新规范化四元数比旋转矩阵更容易,但这只适用于一般矩阵; 一个旋转具有额外的约束条件,使得这个约束条件变得微不足道(这些约束条件被构建到四元数的定义中)(事实上,这是必须的,因为它们具有相同的自由度数)。

那么,使用四元数与矢量或其他替代方法的原因是什么?


万向节锁是一个原因,虽然如你所说,它只是欧拉角的一个问题,并且很容易解决。 由于您只需存储3个数字,所以在内存不足时仍然使用欧拉角。

对于四元数与3x3旋转矩阵,四元数的尺寸(4个标量对9)和速度(四元数乘法比3×3矩阵乘法快得多)具有优势。

请注意,所有这些旋转表示都在实践中使用。 欧拉角使用最少的记忆; 矩阵使用更多的记忆,但不受万向锁的影响,并具有很好的分析性能; 而四元素打破了这两者之间的一个很好的平衡,是轻量级的,但免费的Gimbal锁。


在物理学中,我们没有使用四元数有很好的理由(尽管偶尔讲述关于汉密尔顿/吉布斯等的奇怪故事)。 物理学要求我们的描述具有良好的分析行为(这有一个精确定义的含义,但在某些技术方面远远超出了正常介绍类教导的内容,所以我不会详细讨论)。 事实证明,四元数没有这种好的行为,所以它们没有用,矢量/矩阵就这么做,所以我们使用它们。

那么,我也是一名物理学家。 并且在某些情况下四元数只是摇滚! 例如球面谐波。 你有两个原子散射,交换一个电子:什么是轨道自旋转移? 对于四元数,它只是乘法,即总结表示为四元数的SH基函数的指数。 (把Legendre多项式变成四元数符号虽然有点乏味)。

但我同意,他们不是一个通用的工具,尤其是在刚体力学中,他们使用起来会非常麻烦。 然而,引用贝特朗罗素对一名学生的回答是一个物理学家需要知道多少数学:“尽可能!”

无论如何:为什么我们喜欢计算机图形学中的四元数? 因为他们有一些吸引人的属性。 首先可以很好地插入它们,这对于旋转物体动画是非常重要的,比如关节周围的四肢。 用四元数它只是标量乘法和标准化。 用矩阵表示需要评估sin和cos,然后建立一个旋转矩阵。 然后乘以一个四元数的矢量在经历一个完整的矢量矩阵乘法时仍然更便宜,如果之后添加一个翻译,它也更便宜。 如果考虑人类角色的骨架动画系统,那么必须对大量顶点的大量平移/旋转进行评估,这会产生巨大的影响。

使用四元数的另一个好的副作用是,任何变换本质上都是正交的。 对于平移矩阵,由于数字舍入误差,必须重新对每对动画步骤进行正交归一化。


没有万向节锁定的说法似乎很奇怪,因为这只是一个欧拉角度的问题。 它也仅仅是一个坐标问题(就像极坐标系中r = 0处的奇点(雅可比行列式)),这意味着它只是一个局部问题,可以通过切换坐标,旋转退化,或使用两个重叠的坐标系。

许多3D应用程序,如使用欧拉角来定义对象的方向。 特别是对于飞行模拟,它们代表了一种理论上有用的方式,以便于修改的方式存储方向。

您还应该知道,诸如“切换坐标,退出简并或使用两个重叠的坐标系”等都需要付出努力。 努力意味着代码。 代码意味着性能。 在不需要的情况下丢失性能对于许多3D应用来说不是一件好事。 毕竟,所有这些技巧都会得到什么,如果仅仅使用四元数就能为你提供所需的一切。

我对数字问题不太确定,因为我不清楚这些(以及其他方式)如何实施。 我读过重新规范化四元数比旋转矩阵更容易,但这只适用于一般矩阵; 一个旋转具有额外的约束条件,使得这个约束条件变得微不足道(这些约束条件被构建到四元数的定义中)(事实上,这是必须的,因为它们具有相同的自由度数)。

处理方向的多个连续旋转时出现数字问题。 想象你在太空中有一个物体。 而且每个时间片,你都会对它施加一个小的改变。 每次更改后,您都需要重新标准化方向; 否则,精度问题将会蔓延,并将事情搞砸。

如果你使用矩阵,每次你做矩阵乘法,你必须重新正交矩阵。 你正交归一化的矩阵还不是一个旋转矩阵,所以我不太确定那个简单的正交归一化。 不过,我可以肯定这一点:

它不会像4D向量归一化一样快。 这就是四元数在连续旋转后用来正常化的原因。

四元数正态化便宜。 即使专门的旋转矩阵标准化也不会那么便宜。 表演很重要。

矩阵不容易做的另一个问题是:在两个不同的方向之间进行插值。

在处理3D角色时,通常会有一系列转换来定义角色中每个骨骼的位置。 骨骼层次结构代表特定姿势中的角色。

在大多数动画系统中,为了在特定时间计算角色的姿态,需要在变换之间进行插值。 这需要插入相应的转换。

内插两个矩阵是非平凡的。 至少,如果你想要最后类似于旋转矩阵的东西。 毕竟,插值的目的是在两个转换之间产生一部分内容。

对于四元数,所有你需要的是一个4D的lerp,然后是normalize。 这就是全部:取两个四元数并线性插入组件。 规范化结果。

如果你想要更好的质量插值(有时候你可以),你可以带出球形lerp。 这使得插值对于更多不同的方向表现得更好。 这个数学比四元数困难得多,需要更多的矩阵运算。

链接地址: http://www.djcxy.com/p/81791.html

上一篇: Why are quaternions used for rotations?

下一篇: Combine Rotation Axis Vectors