返回实验室列表

🎮 四元数与空间旋转

Quaternion · $q = w + x\mathbf{i} + y\mathbf{j} + z\mathbf{k}$ · 旋转轴-角度 · 旋转矩阵 · 万向锁

键盘模式
📍 (0, 0, 0)
X Y Z
⏸ 已暂停 — 按空格键继续
键盘操作指南
↑↓←→
水平面移动 (X/Z)
Q / E
垂直升降 (Y)
W / S
绕 X轴 旋转 (俯仰)
A / D
绕 Y轴 旋转 (偏航)
Z / C
绕 Z轴 旋转 (翻滚)
Space
暂停 / 继续
四元数 Quaternion |q| = 1.0000
1.0000 + 0.0000i + 0.0000j + 0.0000k
w (实部)
1.0000
x (i)
0.0000
y (j)
0.0000
z (k)
0.0000
旋转轴 · 角度 Axis-Angle
θ = 0.00°
轴 n = (0, 1, 0)
初始姿态(无旋转)。四元数为单位元 $q = 1$。
旋转矩阵 Rotation Matrix
[
1.000
0.000
0.000
0.000
1.000
0.000
0.000
0.000
1.000
]
欧拉角 Euler Angles ⚠ 有万向锁
Roll (X) = 0.0°   Pitch (Y) = 0.0°   Yaw (Z) = 0.0°
欧拉角直观但有万向锁 (Gimbal Lock) 问题:当俯仰角接近 ±90° 时,偏航与翻滚退化为同一自由度。四元数无此缺陷。
空间位置 Position
(0.00, 0.00, 0.00)
操作记录 Change Log
尚无操作

💡 数学背景

四元数 (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}$,便是这个推导过程的可视化。