三维向量#
c=a×b=aybz−azbyazbx−axbzaxby−aybx⟹c=a×b=∥a∥∥b∥sin(θ)n

最小(角度)旋转#
u=∥a×b∥a×b
通过向量 a 和 b 的叉乘并归一化,得到垂直于两者所在平面的单位向量作为旋转轴。
θ=argcos∥a∥∥b∥a⋅b
通过向量的点积公式计算出 a 和 b 之间的夹角。

罗德里格旋转公式#
已知单位旋转轴 u (∥u∥=1),向量 a 绕该轴旋转角度 θ 得到向量 b。
- 分量定义:
- v=(sinθ)u×a
- t=(1−cosθ)u×(u×a)
b=a+v+t
b=a+(sinθ)u×a+(1−cosθ)u×(u×a)

叉乘的矩阵形式#
将向量 a 与 b 的叉乘表示为矩阵与向量的乘积:
c=a×b=aybz−azbyazbx−axbzaxby−aybx=0az−ay−az0axay−ax0bxbybz=[a]×b
由此,我们也可以把罗德里格公式写成如下形式:
b=(I+(sinθ)[u]×+(1−cosθ)[u]×2)a=Ra
叉乘的行列式表示法#
利用标准正交基向量 i,j,k,可以将两个 3D 向量的叉乘写成行列式的形式:
c=a×b=aybz−azbyazbx−axbzaxby−aybx=detiaxbxjaybykazbz
刚体变换#
指不改变物体形状和大小,只改变其位置和取向的变换。它由以下两种基本变换组合而成:
- 平移: 物体沿特定方向移动,所有点的位移矢量相同。
- 旋转: 物体绕空间中某一点或轴线转动。
可以用矩阵表示,注意旋转矩阵是正交矩阵,旋转矩阵的行列式始终为 +1。如果行列式为 −1,则表示包含了一个“镜像反射”,那就不再是纯粹的旋转了。
旋转矩阵的特征值与旋转轴#
旋转矩阵 R 拥有一个实特征值 +1。这意味着存在一个向量 u,满足:
Ru=u
换言之,R 可以被看作是绕着轴 u 旋转了某个角度 θ。
-
寻找旋转轴 u:
由 Ru=u 可推导出 u=RTu,进而得出:
(R−RT)u=0
其中 (R−RT) 是一个反对称矩阵 (Skew-symmetric):
0r21−r12−(r13−r31)−(r21−r12)0r32−r23r13−r31−(r32−r23)0u=0
在 R=RT(即 sinθ=0,角度 θ=0∘ 或 180∘)的情况下,旋转轴 u 可以通过下式提取:
u←u′=r32−r23r13−r31r21−r12
-
寻找旋转角度 θ:
结合罗德里格旋转公式:
R=I+(sinθ)[u]×+(1−cosθ)[u]×2
R−RT=2sinθ[u]×
当从矩阵中提取出向量 u′ 时,其模长满足:
∥u′∥=2sinθ
这为从已知的旋转矩阵 R 中恢复旋转轴和旋转角提供了直接计算方法。
-
利用矩阵的迹 (Trace) 计算旋转角:
通过旋转矩阵 R 的迹(主对角线元素之和)可以更直接地计算旋转角度 θ:
tr(R)=1+2cosθ
θ=arccos2tr(R)−1
旋转的表示方法#
朴素矩阵表示#
一个旋转矩阵 R 包含 9 个参数 aij:
R=a11a21a31a12a22a32a13a23a33
约束条件:
由于旋转矩阵必须满足正交性 RTR=I 且行列式 detR=1,这引入了 6 个独立的约束方程:
⎩⎨⎧a112+a212+a312=1a122+a222+a322=1a132+a232+a332=1
⎩⎨⎧a11a12+a21a22+a31a32=0a11a13+a21a23+a31a33=0a12a13+a22a23+a32a33=0
自由度 (DoF):
9 (参数)−6 (约束)=3
朴素矩阵表示的缺点:无法差值,多个旋转组合时可能丢失正交性
欧拉角表示#
基础旋转矩阵 (Basic Rotations):
绕各轴旋转特定角度的矩阵表示:
Rx(α)=1000cosαsinα0−sinαcosα
Ry(β)=cosβ0−sinβ010sinβ0cosβ
Rz(γ)=cosγsinγ0−sinγcosγ0001
旋转组合:
允许将三个基础旋转以任何顺序组合,但排除连续两次绕同一轴旋转的情况。常见的顺序包括:
- XYZ, XZY, YZX, YXZ, ZYX, ZXY
- XYX, XZX, YXY, YZY, ZXZ, ZYZ
万向锁:
- 在欧拉角模型中,物体绕轴转动时,另外两个轴也会随着物体转动,可以理解为轴和物体之间并没有发生任何相对运动。
- 首先假设我们按照 x-y-z 的顺序旋转物体,那么如果沿 y 轴旋转时,转动的角度恰好为 90°,此时发生万向锁现象,接下来你再如何转动 z 轴,所产生的效果和一开始转动 x 轴是一样的。
- 这是由于你转 y 轴的时候,物体的 z 轴也跟着旋转了 90°,正好把 z 轴转到了初始时 x 轴上,也就是此时 z 轴的方向与初始 x 轴的方向重合,所以接下来沿 z 轴的转动等价于初始时沿 x 轴的转动。
- 为什么强调“初始时”,显然是因为此时 x 轴也被 y 轴带着转了。
干着讲太抽象了,建议配合视频理解这玩意,或者可以在这个欧拉角可视化网站 ↗上自己模拟一下。
欧拉角表示的缺点:无法解决万向锁的问题
轴角表示#
轴角 (u,θ): 使用以下两个分量表示旋转:
- 向量 u: 旋转轴。
- 标量 θ: 旋转角度。
旋转向量 (Rotation vector): 将旋转表示为一个单一向量 θ:
- θ=θu
显而易见的关系:
- 旋转角度等于向量的模长:θ=∥θ∥
- 旋转轴等于向量的单位化:u=∥θ∥θ
插值(角速度恒定):
- 计算两个旋转向量之间的相对旋转矩阵:
R(δθ)=RT(θ0)R(θ1)
其中 θ0=θ0u0,θ1=θ1u1 分别为起始和目标旋转向量。
- 对旋转向量的变化量进行线性插值:
δθt=(1−t)0+tδθ
这里通过对相对旋转向量 δθ 进行缩放来实现平滑过渡。
- 合成插值后的旋转矩阵:
R(θt)=R(θ0)R(δθt)
轴角表示的缺点:需要转换成矩阵形式再应用
四元数表示#
四元数:
四元数是复数的扩展,定义在集合 H 上:
q=a+bi+cj+dk∈H,a,b,c,d∈R
基本运算规则:
i2=j2=k2=−1
- 单位向量的乘法(类似于叉乘):
- ij=k,ji=−k
- jk=i,kj=−i
- ki=j,ik=−j
四元数的向量表示:
四元数 q 可以表示为标量部分 w 和向量部分 v 的组合:
q=w+xi+yj+zk⇒q=wxyz=[wv]
- q=[w,v]T∈H,w∈R,v∈R3
- 标量四元数: w=[w,0]T
- 纯四元数: v=[0,v]T
基本运算:
- 共轭: q∗=[w,−v]T
- 数乘: tq=[tw,tv]T
- 加法: q1+q2=[w1+w2,v1+v2]T
- 点积: q1⋅q2=w1w2+v1⋅v2
- 范数: ∥q∥=w2+v⋅v=q⋅q
四元数乘法:
q1q2=[w1v1][w2v2]=[w1w2−v1⋅v2w1v2+w2v1+v1×v2]
- 非交换性: q1q2=q2q1
- 结合律: q1q2q3=(q1q2)q3=q1(q2q3)
- 乘积的共轭: (q1q2)∗=q2∗q1∗
- 范数与乘法: ∥q∥2=q∗q=qq∗
逆与单位四元数:
qq−1=1⇒q−1=∥q∥2q∗
- 单位四元数:
对于任何非零四元数 q~,其归一化形式为 q=∥q~∥q~,满足 ∥q∥=1。
- 单位四元数的逆:
对于单位四元数,q−1=q∗=[w−v]。这类似于旋转矩阵的正交性 R−1=RT。
四元数表示旋转:
任何三维旋转 (u,θ) 都可以用一个单位四元数 来表示:
q=[wv]=[cos2θusin2θ]
- 角度: θ=2argcosw
- 轴: u=∥v∥v
应用旋转:
对于三维向量 p,其旋转结果 p′ 可以通过四元数乘法计算:
[0p′]=q[0p]q∗=(−q)[0p](−q)∗
注意 q 和 −q 表示相同的旋转。
复合旋转:
已知两个单位四元数 q1,q2,它们的复合旋转可以表示为:
q=q2q1
球面线性插值#
基本定义:
球面线性插值用于在两个单位四元数 q0 和 q1 之间进行平滑过渡,插值结果 qt 依然保持在单位球面上。其基本形式为:
qt=a(t)q0+b(t)q1
公式推导:
设 p 和 q 为两个单位四元数,它们之间的夹角为 θ,满足 cosθ=p⋅q。插值向量 r 位于它们构成的平面内:
- 投影关系:
- p⋅r=a(t)p⋅p+b(t)q⋅p⇒costθ=a(t)+b(t)cosθ
- q⋅r=a(t)q⋅p+b(t)q⋅q⇒cos(1−t)θ=a(t)cosθ+b(t)
- 系数解得:
a(t)=sinθsin[(1−t)θ],b(t)=sinθsintθ
最终公式:
qt=sinθsin[(1−t)θ]q0+sinθsintθq1