四元数与3D旋转
摘要:介绍四元数的一些性质,及其推导过程。主要参考Krasjet的文档,写的非常详细,如果想看更加详细的过程,建议去看看文档。这里主要做了简洁浓缩,方便快速查看。
一、复数与2D旋转
在讲解四元数之前,先讲解下复数的性质。后续四元数有很多相似的地方。
1.1 复数的表示
任意一个复数 𝑧 ∈ C 都可以表示为 𝑧 = 𝑎 + 𝑏𝑖 的形式,其中 𝑎, 𝑏 ∈ R 而且
𝑖
2
=
−
1
𝑖^{2} = −1
i2=−1。我们将 𝑎 称之为这个复数的实部(Real Part),𝑏 称之为这个复数的虚部(Imaginary Part)。
𝑧 = 𝑎 + 𝑏𝑖 其实就是对于 {1, 𝑖} 这个基的线性组合,我们也可以用向量来表示一个复数:
z
=
[
a
b
]
z=\begin{bmatrix} a\\ b \end{bmatrix}
z=[ab]
1.2 复数的乘法
如果有两个复数
𝑧
1
=
𝑎
+
𝑏
𝑖
,
𝑧
2
=
𝑐
+
𝑑
𝑖
𝑧_{1} = 𝑎 + 𝑏𝑖, 𝑧_{2} = 𝑐 + 𝑑𝑖
z1=a+bi,z2=c+di,我们可以使用分配律来计算它们的乘积:
𝑧
1
𝑧
2
=
(
𝑎
+
𝑏
𝑖
)
(
𝑐
+
𝑑
𝑖
)
=
𝑎
𝑐
+
𝑎
𝑑
𝑖
+
𝑏
𝑐
𝑖
+
𝑏
𝑑
𝑖
2
𝑧_{1}𝑧_{2} = (𝑎 + 𝑏𝑖)(𝑐 + 𝑑𝑖) = 𝑎𝑐 + 𝑎𝑑𝑖 + 𝑏𝑐𝑖 + 𝑏𝑑𝑖^{2}
z1z2=(a+bi)(c+di)=ac+adi+bci+bdi2
其中
𝑖
2
=
−
1
𝑖^{2} = -1
i2=−1,进一步化简为:
𝑧
1
𝑧
2
=
𝑎
𝑐
−
𝑏
𝑑
+
𝑎
𝑑
𝑖
+
𝑏
𝑐
𝑖
=
𝑎
𝑐
−
𝑏
𝑑
+
(
𝑏
𝑐
+
𝑎
𝑑
)
𝑖
𝑧_{1}𝑧_{2} = 𝑎𝑐 − 𝑏𝑑 + 𝑎𝑑𝑖 + 𝑏𝑐𝑖= 𝑎𝑐 − 𝑏𝑑+(𝑏𝑐 + 𝑎𝑑)𝑖\\
z1z2=ac−bd+adi+bci=ac−bd+(bc+ad)i
写成矩阵的形式如下:
𝑧
1
𝑧
2
=
[
a
−
b
b
a
]
.
[
c
d
]
𝑧_{1}𝑧_{2}=\begin{bmatrix} a & -b\\ b & a \end{bmatrix}.\begin{bmatrix} c\\ d \end{bmatrix}
z1z2=[ab−ba].[cd]
右侧的 [ c d ] \begin{bmatrix} c\\ d \end{bmatrix} [cd]是用向量的形式来表示的 𝑧 2 𝑧_{2} z2,而左侧的 [ a − b b a ] \begin{bmatrix} a & -b\\ b & a \end{bmatrix} [ab−ba]则是 z 1 z_{1} z1 的矩阵形式。我们可以发现,复数相乘这个运算,其实是与 [ a − b b a ] \begin{bmatrix} a & -b\\ b & a \end{bmatrix} [ab−ba]这个矩阵所代表的变换是等价的。
1.3 复数的模长与共轭
如果 𝑧 = 𝑎 + 𝑏𝑖,那么它的模长为:
∣
∣
z
∣
∣
=
a
2
+
b
2
||z|| = \sqrt{a^{2}+b^{2}}
∣∣z∣∣=a2+b2
共轭为:
z
‾
=
𝑎
−
𝑏
𝑖
\overline{z}= 𝑎 − 𝑏𝑖
z=a−bi
复数的模长
∣
∣
z
∣
∣
||z||
∣∣z∣∣,可以通过与其共轭矩阵相乘得到:
𝑧
z
‾
=
(
𝑎
+
𝑏
𝑖
)
(
𝑎
−
𝑏
𝑖
)
=
𝑎
2
−
𝑎
𝑏
𝑖
+
𝑎
𝑏
𝑖
+
𝑏
2
=
𝑎
2
+
𝑏
2
=
∥
𝑧
∥
2
𝑧\overline{z} = (𝑎 + 𝑏𝑖)(𝑎 − 𝑏𝑖)= 𝑎 2 − 𝑎𝑏𝑖 + 𝑎𝑏𝑖 + 𝑏 2= 𝑎 2 + 𝑏 2 = ∥𝑧 ∥ 2
zz=(a+bi)(a−bi)=a2−abi+abi+b2=a2+b2=∥z∥2
1.4 复数相乘与 2D 旋转
既然与复数的相乘代表着
[
a
−
b
b
a
]
\begin{bmatrix} a & -b\\ b & a \end{bmatrix}
[ab−ba]矩阵所作出的变换,那这种变换代表着什么呢?
[
a
−
b
b
a
]
=
a
2
+
b
2
.
[
a
a
2
+
b
2
−
b
a
2
+
b
2
b
a
2
+
b
2
a
a
2
+
b
2
]
\begin{bmatrix} a & -b\\ b & a \end{bmatrix} = \sqrt{a^{2}+b^{2}}.\begin{bmatrix} \frac{a}{\sqrt{a^{2}+b^{2}}} & \frac{-b}{\sqrt{a^{2}+b^{2}}}\\ \frac{b}{\sqrt{a^{2}+b^{2}}} & \frac{a}{\sqrt{a^{2}+b^{2}}} \end{bmatrix}
[ab−ba]=a2+b2.[a2+b2aa2+b2ba2+b2−ba2+b2a]
结合下面的图形,上面的矩阵可以变成下面的形式:
[
a
−
b
b
a
]
=
a
2
+
b
2
.
[
c
o
s
(
θ
)
−
s
i
n
(
θ
)
s
i
n
(
θ
)
c
o
s
(
θ
)
]
=
∣
∣
z
∣
∣
.
[
c
o
s
(
θ
)
−
s
i
n
(
θ
)
s
i
n
(
θ
)
c
o
s
(
θ
)
]
\begin{bmatrix} a & -b\\ b & a \end{bmatrix} = \sqrt{a^{2}+b^{2}}.\begin{bmatrix} cos(\theta ) & -sin(\theta)\\ sin(\theta) & cos(\theta ) \end{bmatrix}= ||z||.\begin{bmatrix} cos(\theta ) & -sin(\theta)\\ sin(\theta) & cos(\theta ) \end{bmatrix}
[ab−ba]=a2+b2.[cos(θ)sin(θ)−sin(θ)cos(θ)]=∣∣z∣∣.[cos(θ)sin(θ)−sin(θ)cos(θ)]
右边的
[
c
o
s
(
θ
)
−
s
i
n
(
θ
)
s
i
n
(
θ
)
c
o
s
(
θ
)
]
\begin{bmatrix} cos(\theta ) & -sin(\theta)\\ sin(\theta) & cos(\theta ) \end{bmatrix}
[cos(θ)sin(θ)−sin(θ)cos(θ)]则是我们熟悉的 2D 旋转矩阵,左侧的模长
∣
∣
z
∣
∣
||z||
∣∣z∣∣则是缩放。
综上得到复数表示的2D旋转公式:
如果我们将向量
v
=
[
x
y
]
v=\begin{bmatrix} x\\ y \end{bmatrix}
v=[xy]看作是一个复数 𝑣 = 𝑥 + 𝑦𝑖,其中实部为 𝑥,虚部为 𝑦。
那么,我们可以构造一个复数 𝑧 = cos( θ ) + 𝑖 sin( θ ),并将它与 𝑣 相乘来进行旋转。
旋转 θ 度之后的向量 𝑣 ′ 可以用等价的复数乘法来表示:
𝑣
′
=
𝑧
𝑣
=
(
c
o
s
(
θ
)
+
𝑖
s
i
n
(
θ
)
)
𝑣
𝑣 ′ = 𝑧𝑣 = (cos( θ ) + 𝑖 sin( θ ))𝑣
v′=zv=(cos(θ)+isin(θ))v
1.5 复数的极坐标形式
根据欧拉公式:
c
o
s
(
θ
)
+
𝑖
s
i
n
(
θ
)
=
𝑒
𝑖
θ
cos( θ ) + 𝑖 sin( θ ) = 𝑒^{𝑖θ}
cos(θ)+isin(θ)=eiθ
可以得到复数的指数形式:
z
=
∣
∣
z
∣
∣
.
[
c
o
s
(
θ
)
−
s
i
n
(
θ
)
s
i
n
(
θ
)
c
o
s
(
θ
)
]
=
∣
∣
z
∣
∣
(
c
o
s
(
θ
)
+
i
s
i
n
(
θ
)
)
=
∣
∣
z
∣
∣
e
i
θ
z=||z||.\begin{bmatrix} cos(\theta ) & -sin(\theta)\\ sin(\theta) & cos(\theta ) \end{bmatrix}=||z||(cos(\theta) + isin(\theta))=||z||e^{i\theta}
z=∣∣z∣∣.[cos(θ)sin(θ)−sin(θ)cos(θ)]=∣∣z∣∣(cos(θ)+isin(θ))=∣∣z∣∣eiθ
如果我们定义
𝑟
=
∥
𝑧
∥
𝑟 = ∥𝑧∥
r=∥z∥,我们就得到了复数的极坐标形式:
𝑧
=
𝑟
e
i
θ
𝑧 = 𝑟e^{i\theta}
z=reiθ
二、四元数的定义与性质
2.1 四元数的定义
四元数的定义和复数非常类似,唯一的区别就是四元数一共有三个虚部,而复数只有一个。
𝑞
=
𝑎
+
𝑏
𝑖
+
𝑐
𝑗
+
𝑑
𝑘
,
(
𝑎
,
𝑏
,
𝑐
,
𝑑
∈
R
)
𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘, (𝑎, 𝑏, 𝑐, 𝑑 ∈ R)
q=a+bi+cj+dk,(a,b,c,d∈R)
其中:
𝑖
2
=
𝑗
2
=
𝑘
2
=
𝑖
𝑗
𝑘
=
−
1
𝑖^{2} = 𝑗^{2} = 𝑘^{2} = 𝑖𝑗 𝑘 = −1
i2=j2=k2=ijk=−1
与复数类似,因为四元数其实就是对于基 {1, 𝑖, 𝑗, 𝑘} 的线性组合,四元数也可以写成向量的形式:
q
=
[
a
b
c
d
]
q=\begin{bmatrix} a\\ b\\ c\\ d \end{bmatrix}
q=⎣⎢⎢⎡abcd⎦⎥⎥⎤
除此之外,我们经常将四元数的实部与虚部分开,并用一个三维的向量来表示虚部,将它表示为标量和向量的有序对形式:
𝑞
=
[
𝑠
,
v
]
.
(
v
=
[
x
y
z
]
,
𝑠
,
𝑥
,
𝑦
,
𝑧
∈
R
)
𝑞 = [𝑠, v]. (v =\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix} , 𝑠, 𝑥, 𝑦, 𝑧 ∈ R)
q=[s,v].(v=⎣⎡xyz⎦⎤,s,x,y,z∈R)
2.2 四元数的性质
针对于四元数𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘,介绍它的一些性质
模长:
∣ ∣ q ∣ ∣ = a 2 + b 2 + c 2 + d 2 ∣ ∣ q ∣ ∣ = s 2 + ∣ ∣ v ∣ ∣ 2 = s 2 + v . v ||q||=\sqrt{a^{2}+b^{2}+c^{2}+d^{2}}\\ ||q||=\sqrt{s^{2}+||v||^{2}}=\sqrt{s^{2}+v.v} ∣∣q∣∣=a2+b2+c2+d2∣∣q∣∣=s2+∣∣v∣∣2=s2+v.v
加减法
四元数的加法只需要将分量相加就可以了
乘法
除了交换律之外,我们经常使用的结合律和分配律在四元数内都是成立的。
如果有两个四元数
𝑞
1
=
𝑎
+
𝑏
𝑖
+
𝑐
𝑗
+
𝑑
𝑘
𝑞_{1} = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘
q1=a+bi+cj+dk 和
𝑞
2
=
𝑒
+
𝑓
𝑖
+
𝑔
𝑗
+
h
𝑘
𝑞_{2} = 𝑒 + 𝑓 𝑖 + 𝑔 𝑗 + ℎ𝑘
q2=e+fi+gj+hk,那么他们的相乘为:
2.3 四元数的矩阵形式
从上述公式看出,四元数的相乘其实也是一个线性组合,我们同样可以将它写成矩阵的形式:
注意,这个矩阵所做出的变换等价于左乘
𝑞
1
𝑞_{1}
q1。
因为四元数不符合交换律,所以右乘
𝑞
1
𝑞_{1}
q1 的变换是一个不同的矩阵。
2.4 Graßmann 积
对上述公式,寻找规律,可以得到另一种形式的表达,也就是Graßmann 积(想知道详细过程,建议看看源文档3.1.6)。
如果令
v
=
[
b
c
d
]
v=\begin{bmatrix} b\\ c\\ d \end{bmatrix}
v=⎣⎡bcd⎦⎤,
u
=
[
f
g
h
]
u=\begin{bmatrix} f\\ g\\ h \end{bmatrix}
u=⎣⎡fgh⎦⎤那么:
𝑞
1
𝑞
2
=
[
𝑎
𝑒
−
v
⋅
u
,
𝑎
u
+
𝑒
v
+
v
×
u
]
𝑞_{1}𝑞_{2} = [𝑎𝑒 − \textbf{v}· \textbf{u}, 𝑎\textbf{u} + 𝑒\textbf{v} + \textbf{v} × \textbf{u}]
q1q2=[ae−v⋅u,au+ev+v×u]
2.5 纯四元数
实部为0,仅有虚部的四元数,为纯四元数.因为纯四元数仅由虚部的 3D 向量决定,我们可以将任意的 3D 向量
v
\textbf{v}
v转换为纯四元数。
𝑣
=
[
0
,
v
]
𝑣 = [0, \textbf{v}]
v=[0,v]
如果有两个纯四元数
𝑣
=
[
0
,
v
]
,
𝑢
=
[
0
,
u
]
𝑣 = [0, \textbf{v}], 𝑢 = [0, \textbf{u}]
v=[0,v],u=[0,u],根据Graßmann 积可得:
𝑣
𝑢
=
[
0
−
v
⋅
u
,
0
+
v
×
u
]
=
[
−
v
⋅
u
,
v
×
u
]
𝑣𝑢 = [0 − \textbf{v} · \textbf{u}, 0 + \textbf{v} × \textbf{u}] = [−\textbf{v} · \textbf{u}, \textbf{v} × \textbf{u}]
vu=[0−v⋅u,0+v×u]=[−v⋅u,v×u]
2.6 逆和共轭
因为四元数是不遵守交换律的,我们通常不会将两个四元数相除写为 p q \frac{p}{q} qp的形式,而是写成逆的形式。
- 四元数的逆
q − 1 q^{-1} q−1是 q q q的逆,规定:
𝑞 𝑞 − 1 = 𝑞 − 1 𝑞 = 1 𝑞𝑞^{-1} = 𝑞^{-1} 𝑞 = 1 qq−1=q−1q=1 - 共轭
𝑞 = [ 𝑠 , v ] 𝑞 = [𝑠, \textbf{v}] q=[s,v] 的共轭为 𝑞 ∗ = [ 𝑠 , − v ] 𝑞 ∗ = [𝑠, −\textbf{v}] q∗=[s,−v]。
共轭矩阵有如下性质:
𝑞 𝑞 ∗ = [ 𝑠 , v ] ⋅ [ 𝑠 , − v ] = [ 𝑠 2 − v ⋅ ( − v ) , 𝑠 ( − v ) + 𝑠 v + v × ( − v ) ] = [ 𝑠 2 + v ⋅ v , 0 ] = ∥ 𝑞 ∥ 2 𝑞 ∗ 𝑞 = [ 𝑠 , − v ] ⋅ [ 𝑠 , v ] = [ 𝑠 2 − ( − v ) ⋅ v , 𝑠 v + 𝑠 ( − v ) + ( − v ) × v ] = [ 𝑠 2 + v ⋅ v , 0 ] = ∥ 𝑞 ∥ 2 𝑞𝑞^{*} = [𝑠, \textbf{v}] · [𝑠, −\textbf{v}] = [𝑠^{2} − \textbf{v} · (−\textbf{v}), 𝑠(−\textbf{v}) + 𝑠\textbf{v} + \textbf{v} × (−\textbf{v})] = [𝑠^{2} + \textbf{v} · \textbf{v}, 0]=∥𝑞∥^{2}\\ 𝑞^{*}𝑞 = [𝑠, -\textbf{v}] · [𝑠, \textbf{v}] = [𝑠^{2} − (-\textbf{v}) ·\textbf{v}, 𝑠\textbf{v} + 𝑠(−\textbf{v}) + (−\textbf{v})× \textbf{v}] = [𝑠^{2} + \textbf{v} · \textbf{v}, 0]=∥𝑞∥^{2} qq∗=[s,v]⋅[s,−v]=[s2−v⋅(−v),s(−v)+sv+v×(−v)]=[s2+v⋅v,0]=∥q∥2q∗q=[s,−v]⋅[s,v]=[s2−(−v)⋅v,sv+s(−v)+(−v)×v]=[s2+v⋅v,0]=∥q∥2 - 根据共轭求逆
根据逆的性质,可以得到小面的推导:
𝑞 𝑞 − 1 = 1 𝑞 ∗ 𝑞 𝑞 − 1 = 𝑞 ∗ ( 𝑞 ∗ 𝑞 ) 𝑞 − 1 = 𝑞 ∗ ∣ ∣ q ∣ ∣ 𝑞 − 1 = 𝑞 ∗ 𝑞 − 1 = 𝑞 ∗ ∣ ∣ q ∣ ∣ 𝑞𝑞^{-1} = 1\\ 𝑞^{*}𝑞𝑞^{-1} = 𝑞^{*}\\ (𝑞^{*}𝑞)𝑞^{-1} = 𝑞^{*}\\ ||q||𝑞^{-1} = 𝑞^{*} \\ 𝑞^{-1} = \frac{𝑞^{*}}{||q||}\\ qq−1=1q∗qq−1=q∗(q∗q)q−1=q∗∣∣q∣∣q−1=q∗q−1=∣∣q∣∣q∗
如果 ∥ 𝑞 ∥ = 1 ∥𝑞 ∥ = 1 ∥q∥=1
𝑞 − 1 = 𝑞 ∗ 𝑞^{-1} =𝑞^{*} q−1=q∗
三、四元数与3D旋转
如果我们需要将一个向量
v
v
v 沿着一个用单位向量所定义的旋转轴
u
u
u 旋转
θ
θ
θ度,那么我们可以将这个向量
v
v
v拆分为正交于旋转轴的
v
⊥
v⊥
v⊥ 以及平行于旋转轴的
v
∥
v∥
v∥ 。
我们可以对这两个分向量分别进行旋转,获得
v
′
⊥
v ′⊥
v′⊥ 和
v
′
∥
v ′∥
v′∥ 。
将它们相加就是
v
v
v 旋转之后的结果
v
′
=
v
′
∥
+
v
′
⊥
v ′ = v ′∥ + v ′⊥
v′=v′∥+v′⊥。
关于这块的详细推导可以参考上篇博客《罗德里格斯公式(Rodrigues Formula)》
我们可以将这些向量定义为纯四元数:
注意:加黑的为向量,不加黑的为纯四元数
3.1 垂直量 v ⊥ v_{⊥} v⊥的旋转
我们首先讨论正交于旋转轴的
𝑣
⊥
𝑣_{⊥}
v⊥ 。《罗德里格斯公式(Rodrigues Formula)》里推导过,如果一个向量
v
⊥
\textbf{v}_{⊥}
v⊥ 正交于旋转轴
u
\textbf{u}
u,那么旋转
θ
θ
θ度之后,得到的向量
v
′
⊥
\textbf{v} ′_{⊥}
v′⊥为:
v
′
⊥
=
c
o
s
(
θ
)
v
⊥
+
s
i
n
(
θ
)
(
u
×
v
⊥
)
\textbf{v} ′_{⊥}= cos( θ )\textbf{v}_{⊥} + sin( θ )(\textbf{u} ×\textbf{v}_{⊥} )
v′⊥=cos(θ)v⊥+sin(θ)(u×v⊥)
我们可以很容易地将前面的
v
′
⊥
\textbf{v} ′_{⊥}
v′⊥ 和
v
⊥
\textbf{v}_{⊥}
v⊥ 替换为
𝑣
⊥
𝑣_{⊥}
v⊥和
𝑣
⊥
𝑣_{⊥}
v⊥ 。
但是我们仍遗留下来了一个
u
×
v
⊥
\textbf{u}× \textbf{v}_{⊥}
u×v⊥ 。幸运的是,利用四元数的性质,我们可以将它写成四元数积的形式:
𝑢
𝑣
⊥
=
[
−
u
⋅
v
⊥
,
u
×
v
⊥
]
=
[
0
,
u
×
v
⊥
]
=
u
×
v
⊥
𝑢𝑣 _{⊥} = [−\textbf{u} ·\textbf{v}_{⊥} , \textbf{u} × \textbf{v}_{⊥} ] = [0, \textbf{u} × \textbf{v}_{⊥}] = \textbf{u} × \textbf{v}_{⊥}
uv⊥=[−u⋅v⊥,u×v⊥]=[0,u×v⊥]=u×v⊥
𝑢
𝑣
⊥
𝑢𝑣 _{⊥}
uv⊥同样是一个纯虚四元数。最终我们得到:
v
′
⊥
=
c
o
s
(
θ
)
v
⊥
+
s
i
n
(
θ
)
(
𝑢
𝑣
⊥
)
v ′_{⊥}= cos( θ )v_{⊥} + sin( θ )(𝑢𝑣 _{⊥})
v′⊥=cos(θ)v⊥+sin(θ)(uv⊥)
将
𝑣
⊥
𝑣 _{⊥}
v⊥提出来,将上面公式进一步变换:
v
′
⊥
=
(
c
o
s
(
θ
)
+
s
i
n
(
θ
)
𝑢
)
v
⊥
v ′_{⊥}= (cos( θ ) + sin( θ )𝑢)v_{⊥}
v′⊥=(cos(θ)+sin(θ)u)v⊥
如果我们将
c
o
s
(
θ
)
+
s
i
n
(
θ
)
𝑢
cos( θ ) + sin( θ )𝑢
cos(θ)+sin(θ)u 看做是一个四元数,我们就能将旋转写成四元数的乘积了:
v
′
⊥
=
q
v
⊥
v ′_{⊥}= qv_{⊥}
v′⊥=qv⊥
如果对
q
q
q进一步变形:
𝑞
=
c
o
s
(
θ
)
+
s
i
n
(
θ
)
𝑢
=
[
c
o
s
(
θ
)
,
0
]
+
[
0
,
s
i
n
(
θ
)
u
]
=
[
c
o
s
(
θ
)
,
s
i
n
(
θ
)
u
]
𝑞 = cos( θ ) + sin( θ )𝑢 = [cos( θ ), \textbf{0}] + [0, sin( θ )\textbf{u}] = [cos( θ ), sin( θ )\textbf{u}]
q=cos(θ)+sin(θ)u=[cos(θ),0]+[0,sin(θ)u]=[cos(θ),sin(θ)u]
如果旋转轴 u 的坐标为
[
u
x
u
y
u
z
]
\begin{bmatrix} u_{x}\\ u_{y}\\ u_{z} \end{bmatrix}
⎣⎡uxuyuz⎦⎤,旋转角为 θ ,那么完成这一旋转所需要的四元数 𝑞 可以构造为:
𝑞
=
c
o
s
(
θ
)
+
s
i
n
(
θ
)
𝑢
𝑥
i
+
s
i
n
(
θ
)
𝑢
𝑦
j
+
s
i
n
(
θ
)
𝑢
𝑧
k
𝑞 =cos( θ ) + sin( θ )𝑢_{𝑥}i + sin( θ )𝑢_{𝑦}j + sin( θ )𝑢_{𝑧}k
q=cos(θ)+sin(θ)uxi+sin(θ)uyj+sin(θ)uzk
3.2 平行量 v ∥ v ∥ v∥ 的旋转
平行量旋转之后,不做任何改变
𝑣
′
∥
=
𝑣
∥
𝑣 ′∥ = 𝑣 ∥
v′∥=v∥
3.3 v v v 的旋转
对上面平行和垂直的旋转,进行合成,得到
𝑣
𝑣
v旋转之后的
𝑣
′
𝑣 ′
v′
𝑣
′
=
𝑣
′
∥
+
𝑣
⊥
=
𝑣
∥
+
𝑞
𝑣
⊥
𝑣 ′ = 𝑣 ′∥ + 𝑣 ⊥ = 𝑣 ∥ + 𝑞𝑣 ⊥
v′=v′∥+v⊥=v∥+qv⊥
在进一步变换之前,引入几个定理。
都可采用Graßmann 积证明
- 定理1:如 果 𝑞 = [ c o s ( θ ) , s i n ( θ ) u ] 𝑞 = [cos( θ ), sin( θ )u] q=[cos(θ),sin(θ)u], 而 且 u u u 为 单 位 向 量, 那 么 𝑞 2 = 𝑞 𝑞 = [ c o s ( 2 θ ) , s i n ( 2 θ ) u ] 𝑞^{2} = 𝑞𝑞 =[cos(2θ ), sin(2θ)u] q2=qq=[cos(2θ),sin(2θ)u]。
- 定理2:假设 𝑣 ∥ = [ 0 , v ∥ ] 𝑣 ∥ = [0, v ∥ ] v∥=[0,v∥] 是一个纯四元数,而 𝑞 = [ α , β u ] 𝑞 =[\alpha , \beta u] q=[α,βu],其中 u u u 是一个单位向量, α , β ∈ R \alpha , \beta ∈ R α,β∈R。
如果 v ∥ v ∥ v∥ 平行于 u u u,那么 𝑞 𝑣 ∥ = 𝑣 ∥ 𝑞 𝑞𝑣 ∥ = 𝑣 ∥ 𝑞 qv∥=v∥q.- 定理3:假设 𝑣 ⊥ = [ 0 , v ⊥ ] 𝑣_{⊥} = [0, v _{⊥} ] v⊥=[0,v⊥] 是一个纯四元数,而 𝑞 = [ α , β u ] 𝑞 = [\alpha , \beta u] q=[α,βu],其中 u u u 是一个单位向量, α , β ∈ R \alpha , \beta ∈ R α,β∈R。
如果 𝑣 ⊥ 𝑣_{⊥} v⊥正交于 u u u,那么 𝑞 𝑣 ⊥ = 𝑣 ⊥ 𝑞 ∗ 𝑞𝑣_{⊥ }= 𝑣_{⊥} 𝑞^{*} qv⊥=v⊥q∗
现在进一步对
𝑣
′
=
𝑣
′
∥
+
𝑣
⊥
=
𝑣
∥
+
𝑞
𝑣
⊥
𝑣 ′ = 𝑣 ′∥ + 𝑣 ⊥= 𝑣 ∥ + 𝑞𝑣 ⊥
v′=v′∥+v⊥=v∥+qv⊥进行变换:
和
𝑞
𝑞
q 一样,
∥
𝑝
∥
=
1
,
𝑝
∥𝑝 ∥ = 1,𝑝
∥p∥=1,p 也是一个单位四元数,也就是说:
𝑝
−
1
=
𝑝
∗
𝑝^{-1} = 𝑝^{*}
p−1=p∗
进一步对
𝑣
′
𝑣 ′
v′进行变换:
𝑣
′
=
𝑝
𝑝
−
1
𝑣
∥
+
𝑝
𝑝
𝑣
⊥
=
𝑝
𝑝
∗
𝑣
∥
+
𝑝
𝑝
𝑣
⊥
𝑣 ′ = 𝑝𝑝^{-1}𝑣∥ + 𝑝𝑝𝑣_{⊥}=𝑝𝑝^{*}𝑣 ∥ + 𝑝𝑝𝑣_{⊥}
v′=pp−1v∥+ppv⊥=pp∗v∥+ppv⊥
加入定理1、定理2,进一步变换:
𝑣
′
=
𝑝
𝑝
∗
𝑣
∥
+
𝑝
𝑝
𝑣
⊥
=
𝑝
𝑣
∥
𝑝
∗
+
𝑝
𝑣
⊥
𝑝
∗
=
p
(
𝑣
∥
+
𝑣
⊥
)
𝑝
∗
=
p
v
𝑝
∗
𝑣 ′ = 𝑝𝑝^{*}𝑣 ∥ + 𝑝𝑝𝑣_{⊥}=𝑝𝑣∥𝑝^{*} + 𝑝𝑣_{⊥}𝑝^{*}=p(𝑣∥+ 𝑣_{⊥})𝑝^{*}=pv𝑝^{*}
v′=pp∗v∥+ppv⊥=pv∥p∗+pv⊥p∗=p(v∥+v⊥)p∗=pvp∗
3.4 四元数旋转
综上可以得到四元数表示的旋转。
任意向量 v v v 沿着以单位向量定义的旋转轴 u u u 旋转 θ θ θ 度之后的 v v v′ 可以使用四元数乘法来获得。
令 𝑣 = [ 0 , v ] , q = [ c o s ( 1 2 θ ) , s i n ( 1 2 θ ) u ] 𝑣 = [0, v],q=[cos(\frac{1}{2}\theta ),sin(\frac{1}{2}\theta)u] v=[0,v],q=[cos(21θ),sin(21θ)u],那么:
𝑣 ′ = q v q ∗ = q v q − 1 𝑣 ′ = qvq^{*}=qvq^{-1} v′=qvq∗=qvq−1
虽然这个公式非常简洁,但是它并不是那么直观。如果你想了解它真正的含义的话,还需要将它还原到变形之前的式子:
𝑣
′
=
𝑞
𝑞
∗
𝑣
∥
+
𝑞
𝑞
𝑣
⊥
=
𝑣
∥
+
𝑞
2
𝑣
⊥
𝑣 ′ = 𝑞𝑞^{*}𝑣 ∥ + 𝑞𝑞𝑣_{⊥} = 𝑣 ∥ + 𝑞^{2}𝑣_{⊥}
v′=qq∗v∥+qqv⊥=v∥+q2v⊥
因为所有的旋转四元数的实部都只是一个角度的余弦值,假设有一个单位四元数
𝑞
=
[
𝑎
,
b
]
𝑞 = [𝑎, \textbf{b}]
q=[a,b]。
可以得到旋转角度
θ
θ
θ:
θ
2
=
c
o
s
−
1
(
a
)
\frac{\theta }{2}=cos^{-1}(a)
2θ=cos−1(a)
如果想要再获得旋转轴
u
\textbf{u}
u,那么只需要将
b
\textbf{b}
b的每一项都除以
s
i
n
(
θ
2
)
sin(\frac{θ}{2})
sin(2θ):
u
=
b
s
i
n
(
θ
2
)
\textbf{u} = \frac{\textbf{b}}{sin(\frac{θ}{2})}
u=sin(2θ)b
3.5 旋转的矩阵形式
之前讨论过,左乘一个四元数
𝑞
=
𝑎
+
𝑏
𝑖
+
𝑐
𝑗
+
𝑑
𝑘
𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘
q=a+bi+cj+dk 等同于下面这个矩阵:
L
(
q
)
=
[
a
−
b
−
c
−
d
b
a
−
d
c
c
d
a
−
b
d
c
b
a
]
L(q)=\begin{bmatrix} a &-b & -c & -d\\ b & a & -d & c\\ c & d & a & -b\\ d & c & b & a \end{bmatrix}
L(q)=⎣⎢⎢⎡abcd−badc−c−dab−dc−ba⎦⎥⎥⎤
右乘四元数
q
q
q,等同于下面这个矩阵:
L
(
q
)
=
[
a
−
b
−
c
−
d
b
a
d
−
c
c
−
d
a
b
d
c
−
b
a
]
L(q)=\begin{bmatrix} a &-b & -c & -d\\ b & a & d & -c\\ c & -d & a & b\\ d & c & -b & a \end{bmatrix}
L(q)=⎣⎢⎢⎡abcd−ba−dc−cda−b−d−cba⎦⎥⎥⎤
所以,我们可以利用这两个公式将
𝑣
′
=
𝑞
𝑣
𝑞
∗
𝑣′ = 𝑞𝑣𝑞^{*}
v′=qvq∗ 写成矩阵形式.假设
a
=
c
o
s
(
θ
2
)
,
b
=
s
i
n
(
θ
2
)
u
x
,
c
=
s
i
n
(
θ
2
)
u
y
,
d
=
s
i
n
(
θ
2
)
u
z
,
𝑞
=
𝑎
+
𝑏
𝑖
+
𝑐
𝑗
+
𝑑
𝑘
a=cos(\frac{θ}{2}), b=sin(\frac{θ}{2})u_{x}, c=sin(\frac{θ}{2})u_{y}, d=sin(\frac{θ}{2})u_{z}, 𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘
a=cos(2θ),b=sin(2θ)ux,c=sin(2θ)uy,d=sin(2θ)uz,q=a+bi+cj+dk,我们能得到:
𝑣
′
=
𝑞
𝑣
𝑞
∗
=
𝐿
(
𝑞
)
𝑅
(
𝑞
∗
)
𝑣
=
[
1
0
0
0
0
1
−
2
c
2
−
2
d
2
2
b
c
−
2
a
d
2
a
c
+
2
b
d
0
2
b
c
+
2
a
d
1
−
2
b
2
−
2
d
2
2
c
d
−
2
a
b
0
2
b
d
−
2
a
c
2
a
b
+
2
c
d
1
−
2
b
2
−
2
c
2
]
v
𝑣 ′=𝑞𝑣𝑞^{*} = 𝐿(𝑞)𝑅(𝑞^{*})𝑣=\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1-2c^{2}-2d^{2} & 2bc -2ad & 2ac + 2bd\\ 0 & 2bc+2ad & 1-2b^{2}-2d^{2} & 2cd - 2ab\\ 0 & 2bd - 2ac & 2ab+2cd & 1-2b^{2}-2c^{2} \end{bmatrix}v
v′=qvq∗=L(q)R(q∗)v=⎣⎢⎢⎡100001−2c2−2d22bc+2ad2bd−2ac02bc−2ad1−2b2−2d22ab+2cd02ac+2bd2cd−2ab1−2b2−2c2⎦⎥⎥⎤v
这样我们就得到了 3D 旋转的矩阵形式。因为矩阵的最外圈不会对
𝑣
𝑣
v 进行任何变换,我们可以将它压缩成 3 × 3 矩阵(用作 3D 向量的变换)
v′
=
[
1
−
2
c
2
−
2
d
2
2
b
c
−
2
a
d
2
a
c
+
2
b
d
2
b
c
+
2
a
d
1
−
2
b
2
−
2
d
2
2
c
d
−
2
a
b
2
b
d
−
2
a
c
2
a
b
+
2
c
d
1
−
2
b
2
−
2
c
2
]
.
v
\textbf{v′}=\begin{bmatrix} 1-2c^{2}-2d^{2} & 2bc -2ad & 2ac + 2bd\\ 2bc+2ad & 1-2b^{2}-2d^{2} & 2cd - 2ab\\ 2bd - 2ac & 2ab+2cd & 1-2b^{2}-2c^{2} \end{bmatrix}.\textbf{v}
v′=⎣⎡1−2c2−2d22bc+2ad2bd−2ac2bc−2ad1−2b2−2d22ab+2cd2ac+2bd2cd−2ab1−2b2−2c2⎦⎤.v
四、双倍覆盖
四元数与 3D 旋转的关系并不是一对一的,同一个 3D 旋转可以使用两个不同的四元数来表示。
对任意的单位四元数
q
=
[
c
o
s
(
θ
2
)
,
s
i
n
(
θ
2
)
u
]
q = [cos(\frac{θ}{2}), sin(\frac{θ}{2})\textbf{u}]
q=[cos(2θ),sin(2θ)u]。
𝑞
𝑞
q 与
−
𝑞
−𝑞
−q代表的是同一个旋转。如果
𝑞
𝑞
q 表示的是沿着旋转轴
u
u
u 旋转
θ
θ
θ 度,那么
−
𝑞
−𝑞
−q代表的是沿着相反的旋转轴
−
u
−u
−u 旋转
(
2
π
−
θ
)
(2π − θ )
(2π−θ) 度。
−
q
=
[
−
c
o
s
(
θ
2
)
,
−
s
i
n
(
θ
2
)
u
]
=
[
c
o
s
(
π
−
θ
2
)
,
s
i
n
(
π
−
θ
2
)
(-u)
]
-q = [-cos(\frac{θ}{2}), -sin(\frac{θ}{2})\textbf{u}]= [cos(π -\frac{θ}{2}), sin(π-\frac{θ}{2})\textbf{(-u)}]
−q=[−cos(2θ),−sin(2θ)u]=[cos(π−2θ),sin(π−2θ)(-u)]
有一点需要注意的是,虽然 𝑞 与 −𝑞 是两个不同的四元数,但是由于旋转矩阵中的每一项都包含了四元数两个分量的乘积,它们的旋转矩阵是完全相同的。旋转矩阵并不会出现双倍覆盖的问题。
五、四元数的指数形式
在讨论复数的时候,我们利用欧拉公式将 2D 的旋转写成了
𝑣
′
=
𝑒
𝑖
θ
𝑣
𝑣 ′ = 𝑒^{𝑖 θ} 𝑣
v′=eiθv 这样的指数形式.实际上,我们也可以利用四元数将 3D 旋转写成类似的形式。
如果
u
\textbf{u}
u 是一个单位向量,那么对于单位四元数
𝑢
=
[
0
,
u
]
𝑢 = [0, \textbf{u}]
u=[0,u],有:
𝑒
𝑢
θ
=
c
o
s
(
θ
)
+
𝑢
s
i
n
(
θ
)
=
c
o
s
(
θ
)
+
u
s
i
n
(
θ
)
𝑒^{𝑢θ} = cos( θ ) + 𝑢 sin( θ ) = cos( θ ) + \textbf{u}sin( θ )
euθ=cos(θ)+usin(θ)=cos(θ)+usin(θ)
这也就是说,
𝑞
=
[
c
o
s
(
θ
)
,
s
i
n
(
θ
)
u
]
𝑞 = [cos( θ ), sin( θ )\textbf{u}]
q=[cos(θ),sin(θ)u] 可以使用指数表示为
𝑒
𝑢
θ
𝑒^{𝑢θ}
euθ.
5.1 指数形式的旋转
任意向量
v
v
v 沿着以单位向量定义的旋转轴
u
u
u 旋转
θ
θ
θ 角度之后的
v
′
v ′
v′ 可以使用四元数的指数表示.令
𝑣
=
[
0
,
v
]
,
𝑢
=
[
0
,
u
]
𝑣 = [0, \textbf{v}], 𝑢 = [0, \textbf{u}]
v=[0,v],u=[0,u],那么:
v
′
=
e
u
θ
2
v
e
−
u
θ
2
v ′=e^{u\frac{\theta }{2}}ve^{-u\frac{\theta }{2}}
v′=eu2θve−u2θ
5.2 对数形式
对任意单位四元数
𝑞
=
[
c
o
s
(
θ
)
,
s
i
n
(
θ
)
u
]
𝑞 = [cos( θ ), sin( θ )\textbf{u}]
q=[cos(θ),sin(θ)u]
l
o
g
(
𝑞
)
=
l
o
g
(
𝑒
𝑢
θ
)
=
[
0
,
u
θ
]
log(𝑞) = log(𝑒^{𝑢θ} ) = [0, \textbf{u}θ ]
log(q)=log(euθ)=[0,uθ]
5.3 幂运算
𝑞
t
=
(
𝑒
𝑢
θ
)
𝑡
=
𝑒
𝑢
(
𝑡
θ
)
=
[
c
o
s
(
𝑡
θ
)
,
s
i
n
(
𝑡
θ
)
u
]
𝑞^{t} = (𝑒^{𝑢 θ}) 𝑡 = 𝑒^{𝑢(𝑡 θ )} = [cos(𝑡 θ ), sin(𝑡 θ )\textbf{u}]
qt=(euθ)t=eu(tθ)=[cos(tθ),sin(tθ)u]
一个单位四元数的 𝑡 次幂等同于将它的旋转角度缩放至 𝑡 倍,并且不会改变它的旋转轴。