中EN
概念页

欧拉角与万向节锁

Euler Angles & Gimbal Lock

更新于 2026-10-16 约 5 分钟旋转欧拉角万向节锁相机

欧拉变换用 head(yaw)、pitch、roll 三个角度构造朝向矩阵,直观、易于用日常语言讨论,适合小角度调整和观察者朝向。但它依赖旋转顺序,两组欧拉角难以组合和插值,并且会出现万向节锁,因此更复杂的朝向处理需要四元数。

欧拉变换

默认观察方向沿 −z-z,头部朝 yy: E(h,p,r)=Rz(r)Rx(p)Ry(h)\mathbf{E}(h,p,r)=\mathbf{R}_z(r)\mathbf{R}_x(p)\mathbf{R}_y(h)

  • head 改变像摇头"不",pitch 像点头,roll 像歪头。head 在飞行模拟里也叫 yaw。
  • 矩阵顺序有 24 种选法,书中用的是常见的一种。E\mathbf{E} 是旋转的连乘,所以正交,逆为 ET\mathbf{E}^T。
  • 这些旋转可以相对世界轴,也可以相对局部坐标系。
  • 建模系统常用 x/y/z 顺序,动画中也用 z/x/y,动画与物理中用 z/x/z。z/x/z 的优点是只有绕 x 转半圈(π\pi)时才会锁。**没有能完全避免万向节锁的顺序。**动画师偏爱用曲线编辑器编辑角度随时间的变化,所以欧拉角仍被广泛使用。(RTR4 4.2.2)

从矩阵提取欧拉角

展开 E\mathbf{E} 可得 sin⁡p=e21\sin p=e_{21},e01/e11=−tan⁡re_{01}/e_{11}=-\tan r,e20/e22=−tan⁡he_{20}/e_{22}=-\tan h,于是: h=atan2⁡(−e20,e22),p=arcsin⁡(e21),r=atan2⁡(−e01,e11)h=\operatorname{atan2}(-e_{20},e_{22}),\quad p=\arcsin(e_{21}),\quad r=\operatorname{atan2}(-e_{01},e_{11})

  • 特殊情况 cos⁡p=0\cos p=0:即万向节锁,rr 与 hh 绕同一根轴旋转,只需求一个角。任取 h=0h=0,则 r=atan2⁡(e10,e00)r=\operatorname{atan2}(e_{10},e_{00})。
  • arcsin⁡\arcsin 把 pp 限制在 [−π/2,π/2][-\pi/2,\pi/2],若原矩阵的 pp 超出此范围就无法还原原参数;多组参数可能对应同一个变换。
  • 这种简单方法有数值不稳定问题,可以用更慢的方法避免。

万向节锁

  • 旋转使某个自由度丢失。例如顺序为 x/y/z 时,第二步绕 y 转 π/2\pi/2 会让局部 z 轴与原 x 轴对齐,最后的 z 旋转变得多余。
  • 数学上:p=±π/2+2πkp=\pm\pi/2+2\pi k 时矩阵只依赖一个角 r+hr+h 或 r−hr-h(不能同时两者)。

中间轴转到 ±90°\pm 90° 时,第一轴与第三轴在空间中重合,两个自由度塌成一个,这就是万向节锁。

flowchart TD
  G0["三轴万向节:外环 / 中环 / 内环"] --> Pitch["中间轴转到 ±90°"]
  Pitch --> Align["内环轴与外环轴空间重合"]
  Align --> Lost["两轴转动效果相同:丢失 1 个自由度"]
  Lost --> Lock["万向节锁:只剩 r±h 一个有效角"]

其他局限

  • 两组欧拉角难以组合;插值并非逐角度插值那么简单。甚至两组不同的欧拉角可能表示同一朝向,此时正确的插值应该完全不旋转。
  • 这些是改用四元数的理由。

应用:约束变换

书中例子:虚拟扳手只能绕 x 轴转动,但输入设备给出的是任意旋转矩阵 P\mathbf{P}。做法是从 P\mathbf{P} 中提取欧拉角,只用 pp 重新构造 Rx(p)\mathbf{R}_x(p) 作为扳手的变换。

GEA 的视角(卷 I 5.3.11.1、5.5.1)

  • 用物体自身的轴定义角度:GEA 指出 pitch/yaw/roll 无法用任意朝向的 (i,j,k)(\mathbf{i},\mathbf{j},\mathbf{k}) 定义,而要用模型空间的自然轴 (ℓ,u,f)(\boldsymbol{\ell},\mathbf{u},\mathbf{f}):pitch 绕左/右轴,yaw 绕上轴,roll 绕前轴(见 坐标空间)。这与上文 RTR4 的 head(yaw)/pitch/roll 定义一致,只是 RTR4 直接绑定到「沿 −z 看、y 朝上」的默认朝向。
  • 优点:简单、只需 3 个浮点数、直观;绕单一轴的旋转很容易插值(如在两个偏航角之间直接 lerp θY\theta_Y)。但绕任意轴的旋转无法简单插值。
  • 万向节锁:GEA 的例子是绕 x 轴转 90° 后 y 轴「塌缩」到 z 轴上,之后绕原 y 轴的旋转与绕 z 轴等价,失去一个自由度。
  • 旋转顺序:PYR、YPR、RYP 等每种顺序可能得到不同的复合旋转;各学科没有统一标准(个别学科有自己的约定),所以 [θY θP θR][\theta_Y\ \theta_P\ \theta_R] 三个数不足以唯一确定旋转,必须同时知道顺序。RTR4 给出 24 种顺序的说法,两书一致。
  • 依赖轴映射:yaw 总是绕 up 轴,但没有额外信息就不知道 up 是 x、y 还是 z。
  • 与其他表示的比较见 旋转表示的比较。
  1. realtime_rendering_4ed.pdf 第 4 章 Transforms
  2. Game_Engine_Architecture_4Ed_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 I 第 5 章 5.3.11.1、5.5.1 节

相关页面

游戏数学基本仿射变换Basic Affine Transforms平移、旋转、缩放、切变是摆放和变形物体的基础矩阵;它们的连乘顺序有关、但满足结合律。刚体变换的逆可以直接写出,法线要用伴随矩阵的转置(传统说法是逆转置)变换。理解这些矩阵的性质能写出更快、更正确的变换代码。游戏数学四元数Quaternion单位四元数可以紧凑地表示任意三维旋转,与轴-角表示互相转换很简单,并能做稳定、匀速的朝向插值(slerp),这些都是欧拉角做不好的。它可以高效地转换为矩阵以便与其他变换合并。游戏数学齐次坐标与矩阵约定Homogeneous Coordinates & Matrix Conventions实时渲染用 4×4 矩阵和四元素齐次坐标统一表示点和方向:方向向量 w=0,点 w=1。这样线性变换与平移可以合成为仿射变换并连乘。RTR4 采用列向量记法、右手观察坐标系;DirectX 采用行向量记法,书中强调这只是记法差异。图形学VR 与 AR 显示基础VR & AR Display Fundamentals虚拟现实 (VR) 完全替换用户所见的世界,增强现实 (AR) 把合成物体融入真实世界,二者常合称 XR。本页介绍与渲染相关的硬件与物理要素:追踪与显示设备、"动作到光子"延迟及其导致的模拟器晕动症、姿态预测、镜头光学畸变与色差的软件补偿、滚动与全局显示,以及立体视觉中的辐辏-调节冲突与瞳距。这些约束决定了 VR 渲染为何必须高帧率、低延迟并严格依赖厂商 SDK。图形学坐标空间Coordinate Spaces顶点从模型到屏幕要依次经过模型空间、世界空间、观察空间、裁剪空间、标准化设备坐标 (NDC)、窗口坐标。每一步变换都有明确目的,大部分可以用 4×4 矩阵表示并相乘合并。游戏数学旋转表示的比较Comparison of Rotational Representations旋转可以用欧拉角、3×3 矩阵、轴角、四元数表示,再加上平移与缩放就有 4×4(或 4×3)矩阵与 SRT(SQT)变换;更进一步还有对偶四元数。没有一种在所有场合都最好。GEA 按大小、直观性、能否直接作用于向量、能否插值、有无万向节锁比较它们,并用「参数个数 − 约束个数 = 3 个自由度」统一解释为什么它们用的浮点数不同。游戏开发刚体动力学Rigid Body Dynamics游戏物理引擎关心的是动力学:力如何影响运动。它做了两个简化:经典(牛顿)力学(无量子、无相对论效应)和刚体(形状不变)。无约束刚体有 6 个自由度,其运动可以分成互相独立的线性动力学(质心像质点一样平动)和角动力学(绕质心转动)。线性部分是 F=ma 的常微分方程;三维角动力学则以角动量为主变量,并用一个四元数形式的微分方程更新朝向(GEA4 卷 II 14.4)。

输入关键词开始搜索

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