中EN
概念页

旋转表示的比较

Comparison of Rotational Representations

旋转可以用欧拉角、3×3 矩阵、轴角、四元数表示,再加上平移与缩放就有 4×4(或 4×3)矩阵与 SRT(SQT)变换;更进一步还有对偶四元数。没有一种在所有场合都最好。GEA 按大小、直观性、能否直接作用于向量、能否插值、有无万向节锁比较它们,并用「参数个数 − 约束个数 = 3 个自由度」统一解释为什么它们用的浮点数不同。

总览(卷 I 5.5.1–5.5.5)

表示浮点数优点缺点
欧拉角 [θY θP θR][\theta_Y\ \theta_P\ \theta_R]3简单、最小、直观;单轴旋转易插值万向节锁;依赖旋转顺序;依赖轴到 front/up/left 的映射;任意轴旋转难插值
3×3 矩阵9无万向节锁、唯一表示任意旋转;矩阵乘法直接作用(多数 CPU 和所有 GPU 硬件加速点积与矩阵乘);逆即转置;4×4 统一表示仿射变换不直观;难插值;占空间大
轴角 [a θ][\mathbf{a}\ \theta]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=[s  q  t]\text{SRT}=[s\ \ \mathbf{q}\ \ \mathbf{t}] 或 [s  q  t][\mathbf{s}\ \ \mathbf{q}\ \ \mathbf{t}]。

  • 因为体积小、易插值,SRT 在计算机动画中广泛使用:平移与缩放用 lerp,四元数用 lerp 或 slerp。

旋量(卷 I 5.5.6)

四元数是旋量 (spinor) 的特例——三维中的实值旋量。旋量除了编码从初始朝向到最终朝向的变换,还编码「怎么转过去」,即旋转的奇偶性:中间是否经过完整的 360° 旋转、经过奇数次还是偶数次。这就是四元数「双重覆盖 (double cover)」三维旋转空间的原因:同一对初末朝向有偶、奇两种走法。(RTR4 侧对应的事实是 q^\hat{\mathbf{q}} 与 −q^-\hat{\mathbf{q}} 表示同一旋转,见 四元数。)

对偶四元数(卷 I 5.5.7)

  • 刚体变换是旋转加平移(「螺旋」运动),在动画和机器人学中很普遍,可用对偶四元数 (dual quaternion) 表示。
  • 关键好处:线性插值混合可以做到匀速、最短路径、与坐标系无关,类似平移用 lerp、旋转用 slerp,但能轻松推广到三个及以上变换的混合。
  • 对偶数 a^=a+εb\hat{a}=a+\varepsilon b,对偶单位 ε\varepsilon 满足 ε2=0\varepsilon^2=0 但 ε≠0\varepsilon\ne0,类似复数中的虚数单位。对偶四元数的四个分量是对偶数,可用 8 元素向量表示,也可写成 q^=qa+εqb\hat{\mathbf{q}}=\mathbf{q}_a+\varepsilon\mathbf{q}_b。
  • 理论与实践见 Kavan 等人的论文《Dual Quaternions for Rigid Transformation Blending》;该论文把对偶数写作 a^=a0+εaε\hat{a}=a_0+\varepsilon a_\varepsilon,GEA 用 a+εba+\varepsilon b 以突出与复数的相似(作者脚注说他更喜欢 a1a_1 而不是 a0a_0,把实单位和 ε\varepsilon 看作两根「基向量」)。在蒙皮中的应用可参考 顶点混合与蒙皮。

自由度(卷 I 5.5.8)

自由度 (DOF) 是物体物理状态(位置与朝向)可以独立变化的方式数。不受约束的三维物体有 3 个平移自由度和 3 个旋转自由度,共「六自由度」。各种旋转表示都只有 3 个旋转自由度,参数多出来的部分被约束抵消: NDOF=Nparameters−NconstraintsN_{DOF}=N_{parameters}-N_{constraints}

表示参数约束DOF
欧拉角303
轴角41(轴为单位长度)3
四元数41(单位长度)3
3×3 矩阵96(行与列为单位长度、相互正交)3

GEA 脚注:行列长度的六个约束因为行列相互依赖,只去掉 5 个自由度,第 6 个由正交约束去掉。

原书问题:这一计数写法含糊。「三行三列都是单位长度、行与列都两两正交」共 12 个方程,并不独立。标准计数是:只要求三行正交归一(RRT=I\mathbf{R}\mathbf{R}^T=\mathbf{I}),就是 3 个单位长度约束加 3 个两两正交约束,共 6 个独立约束;列的正交归一会自动成立(RTR=I\mathbf{R}^T\mathbf{R}=\mathbf{I})。9−6=39-6=3 的结论正确。此外,det⁡=+1\det=+1 是排除反射的离散条件,不减少自由度。来源:正交群 O(3)O(3) 的维数为 n(n−1)/2=3n(n-1)/2=3(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 所列优缺点。)
  1. Game_Engine_Architecture_4Ed_-_Jason_Gregory.pdf
  2. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 I 第 5 章 5.5 节

相关页面

游戏数学四元数Quaternion单位四元数可以紧凑地表示任意三维旋转,与轴-角表示互相转换很简单,并能做稳定、匀速的朝向插值(slerp),这些都是欧拉角做不好的。它可以高效地转换为矩阵以便与其他变换合并。游戏数学欧拉角与万向节锁Euler Angles & Gimbal Lock欧拉变换用 head(yaw)、pitch、roll 三个角度构造朝向矩阵,直观、易于用日常语言讨论,适合小角度调整和观察者朝向。但它依赖旋转顺序,两组欧拉角难以组合和插值,并且会出现万向节锁,因此更复杂的朝向处理需要四元数。游戏数学基本仿射变换Basic Affine Transforms平移、旋转、缩放、切变是摆放和变形物体的基础矩阵;它们的连乘顺序有关、但满足结合律。刚体变换的逆可以直接写出,法线要用伴随矩阵的转置(传统说法是逆转置)变换。理解这些矩阵的性质能写出更快、更正确的变换代码。游戏数学齐次坐标与矩阵约定Homogeneous Coordinates & Matrix Conventions实时渲染用 4×4 矩阵和四元素齐次坐标统一表示点和方向:方向向量 w=0,点 w=1。这样线性变换与平移可以合成为仿射变换并连乘。RTR4 采用列向量记法、右手观察坐标系;DirectX 采用行向量记法,书中强调这只是记法差异。游戏美术顶点混合与蒙皮Vertex Blending & Skinning顶点混合(也叫线性混合蒙皮、enveloping、骨骼子空间变形)让一个顶点受多根骨骼的变换影响,按权重混合结果,使关节处的"皮肤"连续弯曲。它非常适合在 GPU 上执行;主要缺点是关节折叠、扭转和自相交,可用双四元数蒙皮等方法改善。图形学顶点压缩与精度Vertex Compression & Precision网格数据像纹理一样可以压缩:传输用的整体压缩(Draco 等)一次性解码,渲染用的定长压缩让顶点着色器在 GPU 上逐顶点解码,从而降低内存、带宽并改善缓存。另一面是精度问题:大世界中单一坐标系会让远离原点的物体抖动,需要相对相机的变换或分段原点。游戏开发动画混合Animation Blending动画混合把两个或多个输入姿势合成一个输出姿势。基本工具是对每个关节的局部 SRT 分别做 lerp(旋转用 nlerp 或 slerp);在此之上有时间插值、交叉淡入淡出、方向移动、一维/二维混合空间、部分骨骼混合和叠加混合(差分片段)。前几种都是加权平均,叠加混合则是"加上一段变化"(GEA4 卷 II 13.6)。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原