🎮 四元数与空间旋转
Quaternion · $q = w + x\mathbf{i} + y\mathbf{j} + z\mathbf{k}$ · 旋转轴-角度 · 旋转矩阵 · 万向锁
💡 数学背景
四元数 (Quaternion):由 Hamilton 于 1843 年发现的四维超复数。一个单位四元数 $q = w + x\mathbf{i} + y\mathbf{j} + z\mathbf{k}$(满足 $|q|=1$)唯一刻画三维空间的一个旋转:绕轴 $\mathbf{n}=(n_x,n_y,n_z)$ 旋转角度 $\theta$,对应 $$q = \cos\frac{\theta}{2} + \sin\frac{\theta}{2}(n_x\mathbf{i}+n_y\mathbf{j}+n_z\mathbf{k})$$
旋转复合:先旋转 $q_1$ 再旋转 $q_2$ 等价于四元数乘法 $q = q_2 q_1$。这正是 Hamilton 四元数乘法的几何意义。
向量旋转公式:空间向量 $\mathbf{v}$ 经旋转 $q$ 后变为 $\mathbf{v}' = q\mathbf{v}\bar{q}$,其中 $\bar{q}$ 是 $q$ 的共轭。
双覆盖 (Double Cover):$q$ 和 $-q$ 表示同一个旋转。单位四元数构成三维球面 $S^3$,旋转群 $SO(3)$ 同构于 $S^3/\{\pm 1\}$。
万向锁 (Gimbal Lock):欧拉角在特定姿态下会丢失一个自由度(例如俯仰角 $\pm 90°$ 时偏航和翻滚退化为同一轴)。四元数表示不会出现此问题,因此被广泛应用于航空、游戏引擎和机器人控制。
与抽象代数的联系:四元数体 $\mathbb{H}$ 是最著名的非交换除环 (division ring),是 Wedderburn 定理和 Brauer 群中的重要对象。单位四元数群与旋转群的关系是 Lie 群理论的经典范例。
❓ 课堂问答 FAQ
Q1:画面看起来是二维的,那小人「跳起来」到更高位置时,怎么在这个平面里看出高度不一样?
实验场景实际是三维 (Three.js 透视投影),只是投影到二维屏幕上。为了让高度变化一眼看清,我们加了三个语义标记:
- 橙色商圈(地面投影):表示小人在地面 (XZ 平面) 上的正下方位置,不随高度变化。
- 虚线垂直“拉线”:从小人脚下到商圈。它越长表示小人跳得越高;y=0 时虚线消失。
- 位置读出器(左上角 📍):高度 y 用橙色高亮,在空中时加 ↑ 符号。
另外,玩家可以右键/中键拖动重新设置镜头角度——从侧面看会更明显地看出高度变化。
Q2:四元数里面有一个向量 $(x,y,z)$ ,是否与“旋转轴 + 旋转角”重复了?
并不重复。单位四元数总共只有 3 个独立实参数(受 $|q|=1$ 约束,4 个变量减去 1 个),恰好对应“轴 (2 个独立参数,因为轴是单位向量) + 角度 (1 个)”一共 3 个。体现为:
$$ q \;=\; \underbrace{\cos\tfrac{\theta}{2}}_{w}\;+\;\underbrace{\sin\tfrac{\theta}{2}}_{\text{含}\,\theta}\,\bigl(\,\underbrace{n_x\mathbf{i}+n_y\mathbf{j}+n_z\mathbf{k}}_{\text{含轴\,}\mathbf{n}}\bigr) $$
- 实部 $w=\cos(\theta/2)$ 只编码了角度;
- 虚部 $(x,y,z) = \sin(\theta/2)\,\mathbf{n}$ 同时编码了轴的方向与角度的 “正弦十足”;
- 从 $(x,y,z)$ 反求轴要除以 $\sin(\theta/2)$,占用了角度信息;反之从 $w$ 只能反求出 $|\theta|$,拿不出轴。
换句话:如果只留下 $w$ 与“轴-角度”里的角度,轴的方向就丢失了;只留下 $(x,y,z)$ 而不附“规范化轴”,则必须再倒推一次。因此三个虚部是“一体两面”,不是冗余。
在右侧「旋转轴 · 角度」面板中,实验以 $w=\cos(\theta/2)$ 为中间量推出 $\theta$,再用 $\sin(\theta/2)$ 从 $(x,y,z)$ 提取轴 $\mathbf{n}$,便是这个推导过程的可视化。