旋转表示的比较
Comparison of Rotational Representations
旋转可以用欧拉角、3×3 矩阵、轴角、四元数表示,再加上平移与缩放就有 4×4(或 4×3)矩阵与 SRT(SQT)变换;更进一步还有对偶四元数。没有一种在所有场合都最好。GEA 按大小、直观性、能否直接作用于向量、能否插值、有无万向节锁比较它们,并用「参数个数 − 约束个数 = 3 个自由度」统一解释为什么它们用的浮点数不同。
总览(卷 I 5.5.1–5.5.5)
| 表示 | 浮点数 | 优点 | 缺点 |
|---|---|---|---|
| 欧拉角 | 3 | 简单、最小、直观;单轴旋转易插值 | 万向节锁;依赖旋转顺序;依赖轴到 front/up/left 的映射;任意轴旋转难插值 |
| 3×3 矩阵 | 9 | 无万向节锁、唯一表示任意旋转;矩阵乘法直接作用(多数 CPU 和所有 GPU 硬件加速点积与矩阵乘);逆即转置;4×4 统一表示仿射变换 | 不直观;难插值;占空间大 |
| 轴角 | 4 | 较直观、紧凑 | 难插值;不能直接作用于向量,需先转成矩阵或四元数 |
| 单位四元数 | 4 | 可直接串接并作用于向量;lerp/slerp 易插值;比矩阵小 | 只能表示旋转 |
| SRT(SQT) | 8(均匀缩放)/ 10(非均匀缩放) | 比 4×3 矩阵(12 个)小;易插值 | 书中未列缺点 |
- 欧拉角细节见 欧拉角与万向节锁;四元数运算与 lerp/slerp 取舍见 四元数;矩阵见 基本仿射变换。
- 轴角中正旋转方向:右手系用右手定则,左手系用左手定则。四元数与轴角的区别在于:轴乘以半角正弦,第四个分量存半角余弦而不是角度本身。
SRT 变换(卷 I 5.5.5)
四元数本身只能表示旋转;与平移向量和缩放因子(均匀缩放用标量,非均匀用向量)组合后就是 4×4 仿射矩阵的替代品,称为 SRT(scale、rotation、translation),因为旋转是四元数也叫 SQT: 或 。
- 因为体积小、易插值,SRT 在计算机动画中广泛使用:平移与缩放用 lerp,四元数用 lerp 或 slerp。
旋量(卷 I 5.5.6)
四元数是旋量 (spinor) 的特例——三维中的实值旋量。旋量除了编码从初始朝向到最终朝向的变换,还编码「怎么转过去」,即旋转的奇偶性:中间是否经过完整的 360° 旋转、经过奇数次还是偶数次。这就是四元数「双重覆盖 (double cover)」三维旋转空间的原因:同一对初末朝向有偶、奇两种走法。(RTR4 侧对应的事实是 与 表示同一旋转,见 四元数。)
对偶四元数(卷 I 5.5.7)
- 刚体变换是旋转加平移(「螺旋」运动),在动画和机器人学中很普遍,可用对偶四元数 (dual quaternion) 表示。
- 关键好处:线性插值混合可以做到匀速、最短路径、与坐标系无关,类似平移用 lerp、旋转用 slerp,但能轻松推广到三个及以上变换的混合。
- 对偶数 ,对偶单位 满足 但 ,类似复数中的虚数单位。对偶四元数的四个分量是对偶数,可用 8 元素向量表示,也可写成 。
- 理论与实践见 Kavan 等人的论文《Dual Quaternions for Rigid Transformation Blending》;该论文把对偶数写作 ,GEA 用 以突出与复数的相似(作者脚注说他更喜欢 而不是 ,把实单位和 看作两根「基向量」)。在蒙皮中的应用可参考 顶点混合与蒙皮。
自由度(卷 I 5.5.8)
自由度 (DOF) 是物体物理状态(位置与朝向)可以独立变化的方式数。不受约束的三维物体有 3 个平移自由度和 3 个旋转自由度,共「六自由度」。各种旋转表示都只有 3 个旋转自由度,参数多出来的部分被约束抵消:
| 表示 | 参数 | 约束 | DOF |
|---|---|---|---|
| 欧拉角 | 3 | 0 | 3 |
| 轴角 | 4 | 1(轴为单位长度) | 3 |
| 四元数 | 4 | 1(单位长度) | 3 |
| 3×3 矩阵 | 9 | 6(行与列为单位长度、相互正交) | 3 |
GEA 脚注:行列长度的六个约束因为行列相互依赖,只去掉 5 个自由度,第 6 个由正交约束去掉。
原书问题:这一计数写法含糊。「三行三列都是单位长度、行与列都两两正交」共 12 个方程,并不独立。标准计数是:只要求三行正交归一(),就是 3 个单位长度约束加 3 个两两正交约束,共 6 个独立约束;列的正交归一会自动成立()。 的结论正确。此外, 是排除反射的离散条件,不减少自由度。来源:正交群 的维数为 (Wikipedia「Orthogonal group」「Rotation matrix」条目)。
如何选择
按下图按需求选型:没有一种表示在所有场合都最好。
flowchart TD
Start["选择旋转表示"] --> Q1{"需要朝向插值?"}
Q1 -->|"是"| Q2{"多个刚体变换混合?"}
Q1 -->|"否"| Q3{"人类编辑 / 单轴约束?"}
Q2 -->|"是"| DQ["对偶四元数"]
Q2 -->|"否"| Quat["四元数 / SRT"]
Q3 -->|"是"| Euler["欧拉角"]
Q3 -->|"否"| Q4{"批量作用于顶点 / GPU?"}
Q4 -->|"是"| Mat["3×3 / 4×4 矩阵"]
Q4 -->|"否"| Q5{"只要紧凑存轴与角?"}
Q5 -->|"是"| AA["轴角"]
Q5 -->|"否"| Quat- 需要插值和紧凑存储(动画关键帧、骨骼姿势):四元数 / SRT。
- 需要批量作用于大量顶点、与 GPU 交互:矩阵(预先串接)。
- 需要人类编辑、单轴旋转(相机偏航、编辑器面板):欧拉角。
- 多个刚体变换的高质量混合:对偶四元数。 (以上选择归纳自本页表格中 GEA 所列优缺点。)
出处
- Game_Engine_Architecture_4Ed_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 I 第 5 章 5.5 节