在三维空间中描述旋转是一件挺麻烦的事。常用的欧拉角虽然直观简单,但是存在顺序依赖和万向节死锁的问题,在通用的旋转运算上并不可行。进而引入的四维数虽然在运算上很有效,但是对于第一次见到的人来说一点也不算直观、易懂。
Krasjet的文章从二维复数出发,进而理解三维四元数的表示意义,循序渐进,通俗易懂,因此记录一下学习笔记。
复数与2D旋转
复数的定义和运算性质不再赘述。对于$ z = a + bi $,相当于对复数基底 $
(1,i) $ 的线性组合,因此可以表示为一个列向量 \(z=[a,b]^T\),但更进一步,其实我们能把复数表示为矩阵。
对于两个复数\(z_1 = a + bi , z_2=c +
di\),可以得到观察一下其乘法结果:
\[
\begin{aligned}
z_1z_2&=a \boldsymbol{c} -b \boldsymbol{d} \\
&+(b \boldsymbol{c}+a \boldsymbol{d})i \\
&=\left[\begin{array}{cc}
a & -b \\
b & a
\end{array}\right]\left[\begin{array}{l}
c \\
d
\end{array}\right]
\end{aligned}
\]
我们知道右边的\([c,d]^T\)是\(z_2\)的列向量表示形式,而左边的矩阵,也只和\(z_1\)的系数有关,因此也可以看做是\(z_1=a+bi\)的矩阵表示。我们不妨尝试将两边都写成矩阵形式:
\[
z_1z_2=\left[\begin{array}{cc}
a & -b \\
b & a
\end{array}\right]
\left[\begin{array}{l}
c & -d\\
d & c
\end{array}\right]
=\left[\begin{array}{cc}
ac-bd & -(bc+ad) \\
bc+ad & ac-bd
\end{array}\right]
=ac-bd + (bc+ad)i
\]
上式可以看出\(z_1,z_2,z_1z_2\)在矩阵表示下也同样满足复数基本运算。这时我们可以发现一个神奇的现象:复数可以表示为矩阵,复数乘法可以表示为矩阵乘法,而矩阵乘法进而可以让我们联想到矩阵表示的仿射变换:
\[
z=\left[\begin{array}{cc}
a & -b \\
b & a
\end{array}\right]
=\sqrt{a^2+b^2}
\left[\begin{array}{cc}
\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{array}\right]
\]
这种式子是不是很眼熟——即以a,b为边的三角变换式:
\[
z=\sqrt{a^2+b^2}\left[\begin{array}{cc}
cos\theta & -sin\theta \\
sin\theta & cos\theta
\end{array}\right]
=\left[\begin{array}{cc}
||z|| & 0 \\
0 & ||z||
\end{array}\right]
\left[\begin{array}{cc}
cos\theta & -sin\theta \\
sin\theta & cos\theta
\end{array}\right]
\]
此时复数\(z=a+bi=||z||(cos\theta+sin\theta
i)\)表示的二维变换水落石出,左边的矩阵是一个
等比放缩矩阵,右边的矩阵是一个
旋转矩阵。复数乘法,即是两个变换矩阵的作用。
并且再将复数的三角形式代回\(z_1z_2\)可知,\(z_1z_2=cos(\theta+\alpha)+sin(\theta+\alpha)
i\) ,即复数的累乘,在变换上体现为旋转角度的累加\(\theta+\alpha\),以及缩放上的累乘。