1. 起源
在二维复平面上,点乘以单位复数就是表示旋转。
z′=z⋅eiθ=z(cosθ+isinθ)
那么,三维空间能不能照抄?
三维空间有三个旋转轴,很自然地会想:能不能引入三个虚数单位 i,j,k,分别对应三个轴的旋转?
也就是说,我们希望构造一种数,形式为 a+bi+cj+dk,其中 i2=j2=k2=−1。
但问题立刻来了:ij 等于什么?
- ij 不能是 1 或 −1,否则 i 和 j 就不是独立的了。
- ij 也不能是 i 或 j,否则两边消去后会推出矛盾。
规定 ij=k,经过推导可得:
ij=k,jk=i,ki=j,ij=−ji
这就是 Hamilton 在 1843 年发现的四元数(Quaternion)。
四元数是形如 q=a+bi+cj+dk 的四维超复数,其中 a,b,c,d∈R,虚数单位满足:
- i2=j2=k2=ijk=−1
- ij=k,jk=i,ki=j
- ij=−ji,jk=−kj,ki=−ik
四元数可以表示为标量-向量形式:
q=(s,v)其中 s=a 是实部,v=(b,c,d) 是虚部向量。
2. 共轭与模长
对于四元数 q=a+bi+cj+dk,其共轭定义为:
q∗=a−bi−cj−dk
用标量-向量形式写就是 (s,v)∗=(s,−v),即保持实部不变,虚部取反。
模长定义为:
∣q∣=a2+b2+c2+d2
和复数一样,qq∗=∣q∣2,因此四元数的逆为:
q−1=∣q∣2q∗
单位四元数是模长为 1 的四元数,即 ∣q∣=1。此时 q−1=q∗,求逆只需要取共轭,计算非常简单。
对于任意非零四元数 q,可以通过归一化得到单位四元数:
q^=∣q∣q=a2+b2+c2+d2q
归一化后的四元数保持原四元数的方向(旋转信息),但模长变为 1,满足单位四元数的性质。
3. 乘法
设 q1=a1+b1i+c1j+d1k,q2=a2+b2i+c2j+d2k,则:
q1q2==(a1+b1i+c1j+d1k)(a2+b2i+c2j+d2k)a1a2−b1b2−c1c2−d1d2+(a1b2+b1a2+c1d2−d1c2)i+(a1c2−b1d2+c1a2+d1b2)j+(a1d2+b1c2−c1b2+d1a2)k
写成向量形式为:
(s1,v1)(s2,v2)=(s1s2−v1⋅v2,s1v2+s2v1+v1×v2)
对于四元数 q1、q2、q3有:
- 结合律: (q1q2)q3=q1(q2q3)
- 非交换性: q1q2=q2q1(一般不满足交换律)
- 共轭反序律: (q2q1)∗=q1∗q2∗
- 模的乘法性: ∣q1q2∣=∣q1∣∣q2∣(可由共轭反序律证明)
3.1 点积与乘法
对于单位四元数 q1=(s1,v1)和任意四元数 q2=(s2,v2),那么:
q1⋅(q2q1)=s1(s2s1−v2⋅v1)+v1⋅(s2v1+s1v2+v2×v1)=s12s2−s1(v2⋅v1)+s2(v1⋅v1)+s1(v1⋅v2)+v1⋅(v2×v1)=s12s2+s2∣v1∣2=s2∣q1∣2=s2(当 ∣q1∣=1 时)
q1⋅(q1q2)=s1(s1s2−v1⋅v2)+v1⋅(s1v2+s2v1+v1×v2)=s12s2−s1(v1⋅v2)+s1(v1⋅v2)+s2(v1⋅v1)+v1⋅(v1×v2)=s12s2+s2∣v1∣2=s2(s12+∣v1∣2)=s2∣q1∣2=s2(当 ∣q1∣=1 时)
对于单位四元数 q1(即 ∣q1∣=1)和任意四元数 q2,有:
q1⋅(q2q1)=q1⋅(q1q2)=Re{q2}
4. 旋转
借鉴二维旋转,那三维旋转最直观的想法是:p′=qp,其中p=(0,v)。但这有两个问题:
- 维度不匹配:结果的实部不一定为零,而向量应该是纯四元数(实部为零)。
- 模长不保持:∣qp∣=∣q∣∣p∣,如果 ∣q∣=1,旋转会缩放向量。
Hamilton 的天才之处在于他发现了夹心乘法(sandwich product):
p′=qpq−1
这个公式到底做了什么?
设旋转轴为单位向量 u,旋转角为 θ,则:
q=cos2θ+usin2θ
为简化记号,令 c=cos2θ,s=sin2θ,则 q=(c,su)。
对于单位四元数,q−1=q∗=(c,−su)。
待旋转向量 v 表示为纯四元数 p=(0,v)。
第一步:计算 qp
qp=(c,su)(0,v)=(c⋅0−su⋅v,cv+0⋅su+su×v)=(−s(u⋅v),cv+s(u×v))
第二步:计算 (qp)q−1
qpq−1=(−s(u⋅v),cv+s(u×v))(c,−su)
先看标量部分:
标量=−sc(u⋅v)−(cv+s(u×v))⋅(−su)=−sc(u⋅v)+sc(v⋅u)+s2(u×v)⋅u=0
(u×v)⋅u=0(叉积垂直于两个因子),所以标量部分为零,结果确实是纯四元数。
再看向量部分:
v′=−s(u⋅v)(−su)+c(cv+s(u×v))+(cv+s(u×v))×(−su)=s2(u⋅v)u+c2v+cs(u×v)−cs(v×u)−s2(u×v)×u
利用 v×u=−u×v 和向量三重积公式 (u×v)×u=−u×(u×v)=−[(u⋅v)u−v](因为 ∣u∣=1):
v′=s2(u⋅v)u+c2v+2cs(u×v)+s2((u⋅v)u−v)=2s2(u⋅v)u+(c2−s2)v+2cs(u×v)
代回三角函数:
- c2−s2=cos22θ−sin22θ=cosθ
- 2cs=2cos2θsin2θ=sinθ
- 2s2=2sin22θ=1−cosθ
得到:
v′=(1−cosθ)(u⋅v)u+cosθ⋅v+sinθ(u×v)
这正是罗德里格斯旋转公式(Rodrigues' Rotation Formula)!
绕单位轴 u 旋转角度 θ 的步骤:
- 构造旋转四元数:q=cos2θ+usin2θ
- 表示向量:p=(0,v)(纯四元数)
- 夹心乘法:p′=qpq−1(单位四元数时 q−1=q∗)
- 提取结果:p′=(0,v′) 的虚部即为旋转后的向量
4.1 双覆盖
设旋转四元数为 q=cos2θ+usin2θ,那么:
−q=−cos2θ−usin2θ=cos2θ+2π+usin2θ+2π
也就是说,−q 相当于在 q 的基础上多旋转了 2π(一整圈)。由于旋转 2π 后物体回到原位,所以 q 和 −q 产生的旋转效果完全相同,这体现了四元数表示旋转的周期性。
每个三维旋转对应两个单位四元数:q 和 −q,这称为双覆盖(double cover)。
4.2 组合旋转
两个四元数相乘 q3=q2q1 那么:
q3pq3−1=(q2q1)p(q2q1)−1=(q2q1)p(q1−1q2−1)(逆的反序律)=q2(q1pq1−1)q2−1(结合律)
对于旋转四元数 q1 和 q2,令 q3=q2q1,则 q3 表示先执行 q1 旋转,再执行 q2 旋转的复合旋转。
5. 球面线性插值(Slerp)
5.1 二维:单位圆 S1
两个点 P1=(cosθ1,sinθ1) 和 P2=(cosθ2,sinθ2),它们的夹角 ϕ=θ2−θ1。
通过点积可以求出夹角:
cosϕ=cosθ1cosθ2+sinθ1sinθ2
圆弧插值很简单,直接对角度线性插值:θ(t)=θ1+tϕ,然后代回得到点 (cosθ(t),sinθ(t))。
利用三角恒等式展开:
cosθ(t)=cos(θ1+tϕ)=cosθ1cos(tϕ)−sinθ1sin(tϕ)
如果是极坐标表示的,那直接能得到ϕ,如果是点坐标,则需要使用arccos反算ϕ。
5.2 三维:单位球面 S2
单位球面上的点用球坐标表示,但更重要的是两点之间的关系。设球面上有两个单位向量 v1 和 v2,它们的夹角 ϕ 满足:
cosϕ=v1⋅v2
球面上两点间的最短路径是大圆弧(过球心的平面与球面的交线)。
v1 和 v2 张成一个过原点的平面,大圆弧就在这个平面上。以 v1 作为该圆的一个基向量,现在求另一个正交基。
将 v2 分解为平行于 v1 和垂直于 v1 的两个分量:
v2=(v2⋅v1)v1+v2⊥=cosϕ⋅v1+v2⊥
垂直分量为:
v2⊥=v2−cosϕ⋅v1
其模长为 ∣v2⊥∣=1−cos2ϕ=sinϕ,归一化得到第二个基:
u=sinϕv2−cosϕ⋅v1
现在大圆弧上任意一点可以用这两个基表示:
v(t)=cos(tϕ)v1+sin(tϕ)u
代入 u:
v(t)=cos(tϕ)v1+sin(tϕ)sinϕv2−cosϕ⋅v1
整理:
v(t)=sinϕcos(tϕ)sinϕ−sin(tϕ)cosϕv1+sinϕsin(tϕ)v2
利用正弦差角公式 sin(A−B)=sinAcosB−cosAsinB:
v(t)=sinϕsin(ϕ−tϕ)v1+sinϕsin(tϕ)v2=sinϕsin((1−t)ϕ)v1+sinϕsin(tϕ)v2
这就是球面线性插值公式。
5.3 四维:单位超球面 S3
单位四元数构成四维空间中的单位超球面 S3。
两个单位四元数 q1 和 q2 的夹角同样由点积给出:
cosϕ=q1⋅q2=a1a2+b1b2+c1c2+d1d2
超球面上的最短路径同样是大圆弧,插值公式与三维形式完全一致:
q(t)=sinϕsin((1−t)ϕ)q1+sinϕsin(tϕ)q2
四元数插值在四维超球面 S3 上进行,但我们关心的是三维旋转空间 SO(3) 中的效果。
四元数 q1 到 q2 的相对旋转可以用 qΔ 表示:
q2=qΔq1⇒qΔ=q2q1−1
qΔ 的实部为 cos2Δθ,其中 Δθ 是相对旋转角。而四元数点积恰好给出:
q1⋅q2=cosϕ=cos2Δθ
因此 ϕ=2Δθ,即四元数空间中的夹角 ϕ 是实际相对旋转角的一半。
这意味着:
- 当 ϕ=2π 时,实际旋转角 Δθ=π(180°)
- 当 q1⋅q2<0 时,ϕ>2π,实际旋转角 Δθ>π,物体没有走最短的的旋转路径
这就是为什么插值前必须检查符号:确保 ϕ≤2π,即 Δθ≤π,走最短旋转路径。
相对旋转四元数 qΔ=q2q1−1 描述了从 q1 到 q2 的旋转。设:
q1=w1+v1,q2=w2+v2
由于 q1 是单位四元数,q1−1=q1∗=w1−v1。计算 qΔ:
qΔ=q2q1∗=(w2+v2)(w1−v1)
展开四元数乘法:
qΔ=w2w1−w2v1+w1v2−v2v1
其中 v2v1=−v2⋅v1+v2×v1=−v1⋅v2−v1×v2,代入得:
qΔ=(w1w2+v1⋅v2)+(w1v2−w2v1+v1×v2)
qΔ 的实部为 w1w2+v1⋅v2=q1⋅q2=cos2Δθ,虚部为:
vec(qΔ)=w1v2−w2v1+v1×v2=ksin2Δθ
因此,旋转轴 k 为:
k=sin2Δθw1v2−w2v1+v1×v2
其中 sin2Δθ=1−(q1⋅q2)2=∣vec(qΔ)∣。
特殊情况:
- 当 Δθ≈0 时,sin2Δθ≈0,旋转轴不确定(两四元数几乎相同),此时退化为线性插值 q(t)=(1−t)q1+tq2,然后归一化
- 当 Δθ=π 时,sin2Δθ=1,k=vec(qΔ)
给定两个单位四元数 q1 和 q2,夹角 ϕ=arccos(q1⋅q2),插值公式为:
Slerp(q1,q2,t)=sinϕsin((1−t)ϕ)q1+sinϕsin(tϕ)q2,t∈[0,1]
特点:
- 保持单位模长:∣q(t)∣=1
- 角速度恒定:沿超球面大圆弧匀速移动
- 端点精确:q(0)=q1,q(1)=q2
注意事项:
-
符号问题:q 和 −q 表示同一个旋转,但插值路径不同。如果 q1⋅q2<0,应将 q2 取反,确保走最短路径。
-
除零问题:当 ϕ≈0 时,sinϕ≈0,公式出现除零。此时退化为线性插值 q(t)=(1−t)q1+tq2,然后归一化。