四元数与 3D 旋转
矩阵表示旋转
绕着 \(x\) 轴旋转:
\[ R_x\left(\alpha\right)=\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha & 0 \\ 0 & \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
绕着 \(y\) 轴旋转:
\[ R_y\left(\beta\right)=\begin{bmatrix} \cos \beta & 0 & \sin \beta & 0 \\ 0 & 1 & 0 & 0 \\ -\sin \beta & 0 & \cos \beta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
绕着 \(z\) 轴旋转:
\[ R_z\left(\gamma\right)=\begin{bmatrix} \cos \gamma & -\sin \gamma & 0 & 0 \\ \sin \gamma & \cos \gamma & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
复数
定义
复数域使用 \(\mathbb{C}\) 表示,\(\forall z \in \mathbb{C}\),都可以表示成 \(z=a+b\mathrm{i}\),其中 \(\mathrm{i}^2 = -1\),\(a, b \in \mathbb{R}\)。\(a\) 称为复数 \(z\) 的实部(Real Part),\(b\) 称为复数 \(z\) 的虚部(Imaginary Part)。\(a\) 可表示为 \(\mathrm{Re}z\),\(b\) 可以表示为 \(\mathrm{Im}z\)。
\(z = a+b\mathrm{i}\) 实际上是对 \(\left\{1,\mathrm{i}\right\}\) 这个基(Basis)的线性组合(Linear Combination),可以使用二维向量来表示复数:
\[ z=\begin{bmatrix} a \\ b \end{bmatrix} \]
既然是一个二维向量,就我们可以非常轻松地把它在平面直角坐标系上画出来:
复数的运算
加减法
设 \(z_1 = a + b \mathrm{i}\),\(z_2=c+d\mathrm{i}\),则:
\[ z_1 \pm z_2=\left(a\pm c\right)+\left(b\pm d\right)\mathrm{i} \]
乘法
设 \(z_1 = a + b \mathrm{i}\),\(z_2=c+d\mathrm{i}\),则:
\[ \begin{align*} z_1z_2 &=\left(a+b\mathrm{i}\right)\left(c+d\mathrm{i}\right)\\ & =ac+ad\mathrm{i}+bc\mathrm{i}+bd\mathrm{i}^2 \\ & =\left(ac-bd\right)+\left(bc+ad\right)\mathrm{i} \end{align*} \]
瞪眼法发现,fuck,这不就是矩阵乘法吗?所以,我们可以把复数看成是一个 \(2\times 2\) 的矩阵作用于一个向量。即:
\[ \begin{align*} z_1z_2 &=\left(ac-bd\right)+\left(bc+ad\right)\mathrm{i}\\ &= \begin{bmatrix} a & -b \\ b & a \end{bmatrix}\begin{bmatrix} c \\d \end{bmatrix} \end{align*} \]
右侧的 \(\begin{bmatrix} c \\d\end{bmatrix}\) 是 \(z_2\) 的向量形式,而左侧的 \(\begin{bmatrix}a & -b \\b & a \end{bmatrix}\) 则是 \(z_1\) 的矩阵形式。
可以看到,复数的乘法,于矩阵 \(\begin{bmatrix}a & -b \\b & a \end{bmatrix}\) 表示的变换是等价的(复数于矩阵的关系不止如此)。
如果 \(z_1\)、\(z_2\) 都使用矩阵形式来表示的话,复数的乘法可以就变成了矩阵的乘法,得到的结果矩阵表示 \(z_2\)、\(z_1\) 的表示的变换的复合变换。即:
\[ \begin{align*} z_1z_2 &= \begin{bmatrix} a &-b \\ b&a \end{bmatrix}\begin{bmatrix} c &-d \\ d&c \end{bmatrix}\\ &= \begin{bmatrix} ac-bd &-(bc+ad) \\ bc+ad & ac-bd \end{bmatrix} \end{align*} \]
注意:复数的乘法是满足交换律的,矩阵的乘法一般是不可交换的,显然复数的矩阵形式也是可以交换的。
来看一些特殊的复数的矩阵形式:
\[ \begin{align*} 1 &= \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} = I \\ \mathrm{i} &= \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} . \end{align*} \]
即:实数单位 \(1\) 与单位矩阵是等价的,虚数单位 \(\mathrm{i}\) 与矩阵 \(\begin{bmatrix}0 & -1 \\1 & 0 \end{bmatrix}\) 是等价的。
我们都知道,\(\mathrm{i}^2 = -1\),用矩阵形式表示就说:
\[ \mathrm{i}^2 = \begin{bmatrix}0 & -1\\1& 0 \end{bmatrix} \begin{bmatrix}0 & -1\\1& 0 \end{bmatrix} = \begin{bmatrix}-1 & 0\\0& -1 \end{bmatrix} = -I = -1 \]
可以矩阵形式也满足 \(\mathrm{i}^2 = -1\).
模长与共轭
设复数 \(z=a+b\mathrm{i}\),则 \(z\) 的模长(Magnitude)定义为:
\[ \|z\|=\sqrt{a^2+b^2} \]
\(z\) 的共轭(Conjugate)定义为:
\[ \overline{z}=a-b\mathrm{i} \]
可以发现:
\[ z\overline{z}=\left(a+b\mathrm{i}\right)\left(a-b\mathrm{i}\right)=a^2+b^2=\|z\|^2 \]
所以:
\[ \|z\|=\sqrt{z\overline{z}} \]
同时我们发现:
\[ a = \frac{z+\overline{z}}{2}, b = \frac{z-\overline{z}}{2\mathrm{i}} \]
复数的指数形式
根据欧拉公式:
\[ \mathrm{e}^{\mathrm{i}\theta}=\cos \theta + \mathrm{i}\sin \theta \]
可以得到复数的指数形式。
设复数 \(z=a+b\mathrm{i}\),则其复数矩阵形式和复数形式为:
\[ \begin{align*} z &= \|z\|\begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} \\ &= \|z\|\left(\cos \theta + \mathrm{i}\sin \theta\right) \\ &= \|z\|\mathrm{e}^{\mathrm{i}\theta} \end{align*} \]
其中: \[\theta = \mathrm{atan2}\left(\frac{b}{a}\right)\]
我们可以得到:
\[ \sin x = \frac{\mathrm{e}^{\mathrm{i}x}-\mathrm{e}^{-\mathrm{i}x}}{2\mathrm{i}},\cos x = \frac{\mathrm{e}^{\mathrm{i}x}+\mathrm{e}^{-\mathrm{i}x}}{2} \]
如果使用复数的指数形式,复数的乘法就变得非常简单,设 \(z_1 =r_1\mathrm{e}^{\mathrm{i}\theta_1}\),\(z_2 =r_2\mathrm{e}^{\mathrm{i}\theta_2}\),则:
\[ z_1z_2=r_1r_2\mathrm{e}^{\mathrm{i}\left(\theta_1+\theta_2\right)} \]
使用三角函数的复数形式可以很方便地证明三角函数的一些公式。
复数与 2D 旋转
前面讨论了复数的矩阵形式,复数 \(z=a+b\mathrm{i}\) 的矩阵形式为 \(\begin{bmatrix}a & -b \\b & a \end{bmatrix}\).
将这个矩阵稍微变形一下:
\[ \begin{align*} \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}\\ &= \|z\|\begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} \\ &= \begin{bmatrix} \|z\| & 0 \\ 0 & \|z\| \end{bmatrix}\begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} \end{align*} \]
哦~,原来这个矩阵表示是一个旋转矩阵和一个缩放矩阵的复合啊(实际上我早就看出来了)。
即:复数 \(z=a+b\mathrm{i}\) 可以表示一个平面上的旋转和缩放变换。缩放因子为:\(\|z\|\),旋转角度为:\(\mathrm{atan2}\left(\frac{b}{a}\right)\)(CCW)。
如果 \(\|z\|=1\),即 \(a^2+b^2=1\) 当如何,即 \(z\) 是一个单位复数,那么这个变换就是一个纯粹的旋转变换:
\[ z=\begin{bmatrix} \cos \theta & -\sin \theta\\ \sin \theta & \cos \theta \end{bmatrix} \]
如果我们想旋转一个二维向量,可以使用矩阵进行变换:
\[ \mathbf{v}'=\begin{bmatrix} \cos \theta & -\sin \theta\\ \sin \theta & \cos \theta \end{bmatrix}\mathbf{v} \]
矩阵 \(\begin{bmatrix} \cos \theta & -\sin \theta\\ \sin \theta & \cos \theta \end{bmatrix}\) 的复数形式为:\(\cos \theta +\mathrm{i}\sin \theta\).
将向量 \(\mathbf{v}=\begin{bmatrix} x \\ y \end{bmatrix}\) 看成一个复数 \(v=x+y\mathrm{i}\),我们可以构造一个复数 \(z=\cos \theta + \mathrm{i} \sin \theta\),那么可以使用复数的乘法来表示旋转变换:
\[ v'=zv=\left(\cos \theta + \mathrm{i} \sin \theta \right) v \]
我们还可以使用复数的指数形式来表示旋转变换:
\[ v'=r\mathrm{e}^{\mathrm{i}\theta}v \]
当然 \(r\mathrm{e}^{\mathrm{i}\theta}\) 表示一个旋转和缩放的复合,如果只需要表示旋转,可以使 \(r=1\).
旋转的复合
假设有两个表示 2D 旋转的单位复数 \(z_1=\cos \theta + \mathrm{i} \sin \theta\)、\(z_2=\cos \phi + \mathrm{i} \sin \phi\),那么这两个旋转的复合变换可以表示为:
\[ \begin{align*} z_1z_2 &= \left(\cos \theta + \mathrm{i} \sin \theta\right)\left(\cos \phi + \mathrm{i} \sin \phi\right)\\ &= \left(\cos \theta \cos \phi - \sin \theta \sin \phi\right) + \mathrm{i}\left(\cos \theta \sin \phi + \sin \theta \cos \phi\right)\\ &= \cos \left(\theta + \phi\right) + \mathrm{i} \sin \left(\theta + \phi\right) \end{align*} \]
3D 空间中的旋转
这里讨论的是绕 3D 空间某一条过原点的轴旋转指定角度。
如果这个轴不过原点咋办?我们可以先将轴平移到原点,然后旋转,最后再平移回去。
假设我们有一个过原点的旋转轴 \(\mathbf{u}\),我们希望将一个向量 \(\mathbf{v}\) 绕这个轴旋转 \(\theta\) 角度,得到 \(\mathbf{v}'\):
以下讨论默认为右手坐标系。
我们发现,如果使用轴 \(\mathbf{u}\) 和 角度 \(\theta\) 来表示一个旋转,这我们一共有 4 个自由度,但如果使用欧拉角来表示旋转,显然只有 3 个自由度。捏是什么回事。
实际上这是因为向量既有大小,又有方向。但如果我们只考虑旋转,则向量的大小无所谓。例如,绕着 \(\left[0,0,1\right]^{\mathrm{T}}\) 旋转和绕着 \(\left[0,0,2\right]^{\mathrm{T}}\) 有什么区别吗?绕着 \(\left[x,y,z\right]^{\mathrm{T}}\) 旋转和绕着 \(k\left[x,y,z\right]^{\mathrm{T}}\) 有什么区别吗?显然没有。
实际上在 3D 空间中定义一个方向只需要两个量就可以了(想想球坐标系或经纬度)。
既然向量的长度没有影响,若无特殊说明,后面讨论的向量 \(\mathrm{u}\) 都为单位向量,即:
\[ \|\mathbf{u}\| = \sqrt{x^2+y^2+z^2} = 1 \]
在编程时,拿到的 \(\mathbf{u}\) 很有可能不是单位向量,所以在使用前需要先将其归一化:
\[ \mathbf{\hat{u}} = \frac{\mathbf{u}}{\|\mathbf{u}\|} \]
旋转的分解
可以将 \(\mathbf{v}\) 分解为平行于旋转轴 \(\mathbf{u}\) 和正交与旋转轴 \(\mathbf{u}\) 的两个分量 \(\mathbf{v}_{\parallel}\) 和 \(\mathbf{v}_{\perp}\)
\[ \mathbf{v}=\mathbf{v}_{\parallel}+\mathbf{v}_{\perp} \]
分别旋转这两部分,在将它们的旋转结果加起来就可以的得到旋转后的向量:
\[ \mathbf{v}'=\mathbf{v}'_{\parallel}+\mathbf{v}'_{\perp} \]
\(\mathbf{v}_{\parallel}\) 实际上就 \(\mathbf{v}\) 在 \(\mathbf{u}\) 上的投影,那我们就快点把他算出来吧:
\[ \mathbf{v}_{\parallel} = \mathrm{proj}_{\mathbf{u}} \mathbf{v} = \left(\mathbf{u} \cdot \mathbf{v}\right) \mathbf{u} \]
向量 \(\mathbf{a}\) 在向量 \(\mathbf{b}\) 上的投影为:
\[ \mathrm{proj}_{\mathbf{b}} \mathbf{a} = \frac{\mathbf{a} \cdot \mathbf{b}}{\| \mathbf{b} \|^2} \mathbf{b} \]
如果 \(\| \mathbf{b} \|=1\),则:
\[ \mathrm{proj}_{\mathbf{b}} \mathbf{a} = \left(\mathbf{a} \cdot \mathbf{b} \right) \mathbf{b} \]
因为 \(\mathbf{v}=\mathbf{v}_{\parallel}+\mathbf{v}_{\perp}\),那么:
\[ \begin{align*} \mathbf{v}_{\perp}&=\mathbf{v}-\mathbf{v}_{\parallel}\\ &=\left(\mathbf{u} \cdot \mathbf{v}\right) \mathbf{u} \end{align*} \]
接下来只需分别讨论 \(\mathbf{v}_{\parallel}\) 和 \(\mathbf{v}_{\perp}\) 的旋转即可。
\(\mathbf{v}_{\parallel}\) 的旋转
显然:
\[ \mathbf{v}_{\parallel}'=\mathbf{v}_{\parallel} \]
\(\mathbf{v}_{\perp}\) 的旋转
\(\mathbf{v}_{\perp}\) 正交于 \(\mathbf{u}\),所以这个旋转实际上在一个平面内。因为旋转不改变向量的长度,所以路径是一个圆,如下图所示:
再构造一个向量 \(\mathbf{w} = \mathbf{u} \times \mathbf{v}_{\perp}\).
实际上向量 \(\mathbf{w}\) 是向量 \(\mathbf{v}_{\perp}\) 逆时针旋转 \(\pi / 2\) 之后得到的结果。可以发现:
\[ \begin{align*} \|\mathbf{w}\| &=\|\mathbf{u} \times \mathbf{v}_{\perp}\|\\ &= \|\mathbf{u}\| \|\mathbf{v}_{\perp}\| \sin \frac{\pi}{2} \\ &= \|\mathbf{v}_{\perp}\| \end{align*} \]
也就是说,\(\|\mathbf{w}\|=\|\mathbf{v}_{\perp}\|\),即 \(\mathbf{w}\) 也在圆上。所以:
\[ \begin{align*} \mathbf{v}_{\perp}' &= \mathbf{v}_{\perp} \cos \theta\ + \mathbf{w} \sin \theta \\ &= \mathbf{v}_{\perp} \cos \theta\ + \left(\mathbf{u}\times \mathbf{\mathbf{v}_{\perp}}\right) \sin \theta \end{align*} \]
\(\mathbf{v}\) 的旋转
根据上面的讨论:
\[ \begin{align*} \mathbf{v}'&=\mathbf{v}_{\parallel}'+\mathbf{v}_{\perp}'\\ &= \mathbf{v}_{\parallel} + \mathbf{v}_{\perp} \cos \theta\ + \left(\mathbf{u}\times \mathbf{\mathbf{v}_{\perp}}\right) \sin \theta \end{align*} \]
叉乘具有结合律:
\[ \begin{align*} \mathbf{u}\times \mathbf{\mathbf{v}_{\perp}}&= \mathbf{u}\times \left(\mathbf{v}-\mathbf{v}_{\parallel}\right)\\ &=\mathbf{u}\times \mathbf{v} - \mathbf{u}\times \mathbf{v}_{\parallel}\\ &= \mathbf{u}\times \mathbf{v} \end{align*} \]
最后,将 \(\mathbf{v}_{\parallel} = \left(\mathbf{u}\cdot \mathbf{v}\right)\mathbf{u}\) 和 \(\mathbf{v}_{\perp} = \mathbf{v} - \left(\mathbf{u}\cdot \mathbf{v}\right)\mathbf{u}\) 带入得:
\[ \begin{align*} \mathbf{v}'&= \left(\mathbf{u}\cdot \mathbf{v}\right)\mathbf{u} + \left(\mathbf{v} - \left(\mathbf{u}\cdot \mathbf{v}\right)\mathbf{u}\right) \cos \theta\ + \left(\mathbf{u}\times \mathbf{\mathbf{v}}\right) \sin \theta\\ &= \mathbf{v} \cos \theta + \left(1- \cos \theta\right) \left(\mathbf{u}\cdot \mathbf{v}\right)\mathbf{u} + \left(\mathbf{u}\times \mathbf{v}\right) \sin \theta \end{align*} \]
即 3D 空间中任意一个向量 \(\mathbf{v}\) 沿单位向量 \(\mathbf{u}\) 旋转 \(\theta\) 之后得到的 \(\mathbf{v}'\) 为:
\[ \mathbf{v}'=\mathbf{v} \cos \theta + \left(1- \cos \theta\right) \left(\mathbf{u}\cdot \mathbf{v}\right)\mathbf{u} + \left(\mathbf{u}\times \mathbf{v}\right) \sin \theta \]
这个公式叫做 Rodrigues' rotation formula.
四元数
四元数与复数像,不同的是,复数只有 1 个虚部,而四元数有 3 个虚部。
四元数的定义为:
\[ q = a + b \mathrm{i} + c \mathrm{j} + d \mathrm{k} \]
其中 \(\mathrm{i}^2=\mathrm{j}^2=\mathrm{k}^2=\mathrm{i}\mathrm{j}\mathrm{k}=-1\),且 \(a,b,c,d\in \mathbb{R}\).
四元数的集合用 \(\mathbb{H}\) 表示,即:\(q\in \mathbb{H}\).
与复数类似,四元数是对 \(\left\{1,\mathrm{i},\mathrm{j},\mathrm{k}\right\}\) 这个基的线性组合,四元数可以写成向量形式:
\[ q=\begin{bmatrix} a\\b\\c\\d \end{bmatrix} \]
还可以将四元数的实部和虚部分开,用一个三维的向量来表示虚部,将四元数表示为标量和向量的有序对:
\[ q = \left[s, \mathbf{v}\right] \]
其中:\(\mathbf{v}=\left[x,y,z\right]^{\mathrm{T}}\),且 \(s,x,y,z \in \mathbb{R}\).
四元数的运算与性质
模长
设四元数 \(q=a+b\mathrm{i}+c\mathrm{j}+d\mathrm{k}\),则 \(q\) 的模长定义为:
\[ \|q\|=\sqrt{a^2+b^2+c^2+d^2} \]
如果使用标量向量的形式来表示的话,设 \(q=\left[s,\mathbf{v}\right]\),则:
\[ \|q\|=\sqrt{s^2+\|\mathbf{v}\|^2} \]
加减法
设 \(q_1 = a + b \mathrm{i} + c \mathrm{j} + d \mathrm{k}\)、\(q_2=e+f\mathrm{i}+g\mathrm{j}+h\mathrm{k}\),则:
\[ q_1 \pm q_2=\left(a\pm e\right)+\left(b\pm f\right)\mathrm{i}+\left(c\pm g\right)\mathrm{j}+\left(d\pm h\right)\mathrm{k} \]
使用标量向量有序对形式表示,设 \(q_1=\left[s_1,\mathbf{v}_1\right]\)、\(q_2=\left[s_2,\mathbf{v}_2\right]\),则:
\[ q_1 \pm q_2=\left[s_1\pm s_2,\mathbf{v}_1\pm \mathbf{v}_2\right] \]
数乘
设四元数 \(q=a+b\mathrm{i}+c\mathrm{j}+d\mathrm{k}\),\(k\in \mathbb{R}\),则:
\[ kq=ka+kb\mathrm{i}+kc\mathrm{j}+kd\mathrm{k} \]
四元数的数乘是可交换的,即:\(kq=qk\),其中 \(k\in \mathbb{R}\) 且 \(q\in \mathbb{H}\).
四元数乘法
四元数乘法是不可交换的。即,一般情况下,对于 \(q_1,q_2\in \mathbb{H}\),一般情况下 \(q_1q_2\neq q_2q_1\).
对于 \(q_1q_2\),称之为「\(q_2\) 左乘以 \(q_1\)」,对于 \(q_2q_1\),称之为「\(q_2\) 右乘以 \(q_1\)」。
虽然四元数乘法不可交换,但是满足结合律和分配律。
设 $q_1=a+b + c +d , \(q_2=e+f \mathrm{i} + g \mathrm{j}+h \mathrm{k}\)$,则:
\[ \begin{align*} q_1 q_2= & (a+b \mathrm{i}+c \mathrm{j}+d \mathrm{k})(e+f \mathrm{i}+g \mathrm{j}+h \mathrm{k}) \\ = & a e+a f \mathrm{i}+a g \mathrm{j}+a h \mathrm{k}+ \\ & b e \mathrm{i}+b f \mathrm{i}^2+b g \mathrm{i} \mathrm{j}+b h \mathrm{i} \mathrm{k}+ \\ & c e \mathrm{j}+c f \mathrm{j} \mathrm{i}+c g \mathrm{j}^2+c h \mathrm{j} \mathrm{k}+ \\ & d e \mathrm{k}+d f \mathrm{k} \mathrm{i}+d g \mathrm{k} \mathrm{j}+d h \mathrm{k}^2 \end{align*} \]
根据以下表格对上述公式进行简化:
\[ \begin{array}{|c|c|c|c|c|} \hline \times & 1 & \mathrm{i} & \mathrm{j} & \mathrm{k} \\ \hline 1 & 1 & \mathrm{i} & \mathrm{j} & \mathrm{k} \\ \hline \mathrm{i} & \mathrm{i} & -1 & \mathrm{k} & -\mathrm{j} \\ \hline \mathrm{j} & \mathrm{j} & -\mathrm{k} & -1 & \mathrm{i} \\ \hline \mathrm{k} & \mathrm{k} & \mathrm{j} & -\mathrm{i} & -1 \\ \hline \end{array} \]
化简后得:
\[ \begin{align*} q_1 q_2 = & (a e-b f-c g-d h)+ \\ & (b e+a f-d g+c h) \mathrm{i}+ \\ & (c e+d f+a g-b h) \mathrm{j}+ \\ & (d e-c f+b g+a h)\mathrm{k} \end{align*} \]
四元数乘法的矩阵形式
类似于复数的乘法,四元数的乘法也可以使用矩阵来表示。
设 \(q_1=a+b\mathrm{i}+c\mathrm{j}+d\mathrm{k}\),\(q_2=e+f\mathrm{i}+g\mathrm{j}+h\mathrm{k}\),则:
\[ q_1q_2=\begin{bmatrix} a & -b & -c & -d \\ b & a & -d & c \\ c & d & a & -b \\ d & -c & b & a \end{bmatrix} \begin{bmatrix} e \\ f \\ g \\ h \end{bmatrix} \]
注意:这个矩阵表示左乘 \(q_1\),右乘 \(q_1\) 的矩阵表示为:
\[ q_2 q_1=\begin{bmatrix} a & -b & -c & -d \\ b & a & d & -c \\ c & -d & a & b \\ d & c & -b & a \end{bmatrix} \begin{bmatrix} e \\ f \\ g \\ h \end{bmatrix} \]
Grassmann 积
前面已经得到:
\[ \begin{align*} q_1 q_2 = & (a e-b f-c g-d h)+ \\ & (b e+a f-d g+c h) \mathrm{i}+ \\ & (c e+d f+a g-b h) \mathrm{j}+ \\ & (d e-c f+b g+a h)\mathrm{k} \end{align*} \]
我们都知道,如果 \(\mathbf{v}=[b,c,d]^{\mathrm{T}}\),\(\mathbf{u}=[f,g,h]^{\mathrm{T}}\),则:
\[ \begin{align*} \mathbf{v} \cdot \mathbf{u} &= b f + c g + d h \\ \mathbf{v} \times \mathbf{u} &= \begin{bmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ b & c & d \\ f & g & h \end{bmatrix} \end{align*} \]
所以:
\[ q_1q_2=ae - \mathbf{v} \cdot \mathbf{u} + a \mathbf{u} + e \mathbf{v} + \mathbf{v} \times \mathbf{u} \]
如果 \(q_1 = \left[s_1, \mathbf{v}_1\right]\),\(q_2 = \left[s_2, \mathbf{v}_2\right]\),则:
\[ q_1q_2=\left[s_1s_2 - \mathbf{v}_1 \cdot \mathbf{v}_2, s_1\mathbf{v}_2 + s_2\mathbf{v}_1 + \mathbf{v}_1 \times \mathbf{v}_2\right] \]
这个结果叫做 Grassmann 积 (Grassmann Product)
纯四元数
如果一个四元数的实部为 0,那么这个四元数就是一个纯四元数。即如果 \(v=\left[0,\mathbf{v}\right]\),则 v 是一个纯四元数。
我们可以将一个纯四元数和一个 3D 向量等价起来。
在后文中,如果 \(\mathbf{v}\) 表示一个向量,则使用 \(v\) 表示 \(\mathbf{v}\) 对于的纯四元数,即:\(v=\left[0,\mathbf{v}\right]\).
逆和共轭
对于四元数 \(q=a+b\mathrm{i}+c\mathrm{j}+d\mathrm{k}\),其共轭定义为:
\[ q^{\star}=a-b\mathrm{i}-c\mathrm{j}-d\mathrm{k} \]
四元数 \(q\) 的逆记为:\(q^{-1}\). 它要满足:
\[ qq^{-1}=q^{-1}q=1 \]
只有当 \(q \neq 0\) 时才可逆。
设 \(q = \left[s, \mathbf{v}\right]\),则 \(q^{\star} = \left[s, -\mathbf{v}\right]\),那么:
\[ \begin{align*} qq^{\star} &= \left[s, \mathbf{v}\right]\left[s, -\mathbf{v}\right] \\ &= \left[s^2 + \mathbf{v} \cdot \mathbf{v}, 0\right] \end{align*} \]
且:
\[ \begin{align*} q^{\star}q &= \left[s, -\mathbf{v}\right]\left[s, \mathbf{v}\right] \\ &= \left[s^2 + \mathbf{v} \cdot \mathbf{v}, 0\right] \end{align*} \]
那么:
\[ \begin{align*} qq^{-1}&=1\\ q^{\star}qq^{-1}&=q^{\star}\\ \|q\|^2 q^{-1}&=q^{\star}\\ q^{-1}&=\frac{q^{\star}}{\|q\|^2} \end{align*} \]
这样就求得了四元数的逆。
如果 \(\|q\|=1\),则 \(q\) 是一个单位四元数,那么:
\[ q^{-1} = \frac{q^{\star}}{\|1\|^2} = q^{\star} \]
四元数与 3D 旋转
在前面以后讨论过如何将一个向量 \(\mathbf{v}\) 绕一个用单位向量表示的旋转轴 \(\mathbf{u}\) 逆时针旋转旋转 \(\theta\) 度,即:将 \(\mathbf{v}\) 分解成平行于 \(\mathbf{u}\) 的向量 \(\mathbf{v}_{\parallel}\) 和正交于 \(\mathbf{u}\) 的向量 \(\mathbf{v}_{\perp}\),然后分别旋转这两部分,得到 \(\mathbf{v}'_{\parallel}\) 和 \(\mathbf{v}'_{\perp}\),最后将这两部分加起来得到 \(\mathbf{v}'\).
我们可以将这些向量定义为纯四元数:
\[ \begin{align*} v &= \left[0, \mathbf{v}\right] \\ v_{\parallel}&= \left[0, \mathbf{v}_{\parallel}\right] \\ v_{\perp}&= \left[0, \mathbf{v}_{\perp}\right] \\ v' &= \left[0, \mathbf{v'}\right] \\ v'_{\parallel}&= \left[0, \mathbf{v}'_{\parallel}\right] \\ v'_{\perp}&= \left[0, \mathbf{v}'_{\perp}\right] \\ u&= \left[0, \mathbf{u}\right] \end{align*} \]
那么有:
\[ \begin{align*} v &= v_{\parallel} + v_{\perp} \\ v' &= v'_{\parallel} + v'_{\perp} \end{align*} \]
下面分别讨论 \(v_{\parallel}\) 和 \(v_{\perp}\).
\(v_{\parallel}\) 的旋转
显然:
\[ v'_{\parallel}=v_{\parallel} \]
\(v_{\perp}\) 的旋转
我们正确推到过:
\[ \mathbf{v}_{\perp}' = \mathbf{v}_{\perp} \cos \theta\ + \left(\mathbf{u}\times \mathbf{\mathbf{v}_{\perp}}\right) \sin \theta \]
我们可以非常容易地将 \(\mathbf{v}'_{\perp}\) 和 \(\mathbf{v}_{\perp}\) 替换为 \(v'_{\perp}\) 和 \(v_{\perp}\),但 \(\mathbf{u}\times \mathbf{\mathbf{v}_{\perp}}\) 又当如何?实际上也很 easy 啦,下面给出推导。
前面已经得到,对于纯四元数 \(v=\left[0,\mathbf{v}\right]\) 和 \(u=\left[0,\mathbf{u}\right]\),有:\(vu=\left[-\mathbf{v}\cdot \mathbf{u}, \mathbf{v}\times \mathbf{u}\right]\)。那么
\[ \begin{align*} uv_{\perp}&= \left[-\mathbf{u}\cdot \mathbf{v}_{\perp}, \mathbf{u}\times \mathbf{v}_{\perp} \right]\\ &=\left[0, \mathbf{u}\times \mathbf{v}_{\perp}\right]\\ &=\mathbf{u}\times \mathbf{v}_{\perp} \end{align*} \]
注意:\(uv_{\perp}\) 也是一个纯四元数。
那么我们就可以得到:
\[ \begin{align*} v'_{\perp} &= v_{\perp} \cos \theta\ + uv_{\perp} \sin \theta\\ &= \left(\cos \theta +u \sin \theta\right)v_{\perp} \end{align*} \]
我们可以将 \(\cos \theta +u \sin \theta\) 看做为一个四元数。令 \(q=\cos \theta +u \sin \theta\),则:
\[ v'_{\perp}=qv_{\perp} \]
对 \(q\) 稍微变形:
\[ \begin{align*} q&=\cos \theta +u \sin \theta\\ &=\left[\cos \theta, 0\right] + \left[0, \mathbf{u} \sin \theta\right] \\ &=\left[\cos \theta, \mathbf{u} \sin \theta\right] \end{align*} \]
也就是说,如果 \(\mathbf{u}=\begin{bmatrix}u_x, u_y, u_z \end{bmatrix}^{\mathrm{T}}\),旋转角为 \(\theta\),那么完全这一旋转所需的四元数 \(q\) 为:
\[ q=\cos \theta + u_{x} \sin \theta \mathrm{i} + u_{y} \sin \theta \mathrm{j} + u_{z} \sin \theta \mathrm{k} \]
即,对于正交于旋转轴 \(\mathbf{u}\) 的向量 \(\mathbf{v}_{\perp}\),旋转 \(\theta\) 角度之后得到 \(\mathbf{v}'_{\perp}\),令 \(v_{\perp}=\left[0,\mathbf{v}_{\perp}\right]\),\(q=\left[\cos \theta, \mathbf{u}\sin\theta\right]\),那么:
\[ v'_{\perp}=qv_{\perp} \]
我们可以发现:
\[ \|q\|= 1 \]
一个普通的四元数表示一个旋转变换和一个缩放变换的复合,而单位四元数表示一个纯粹的旋转变换,这一点和复数非常类似。
\(v\) 的旋转
\[ \begin{align*} v'&=v'_{\parallel}+v'_{\perp}\\ &=v_{\parallel}+qv_{\perp} \end{align*} \]
其中 \(q=\left[\cos\theta,\mathbf{u}\sin\theta\right]\).
接下来要对上面的公式进行简化,在简化之前像给出两个引理。
引理 1:如果 \(q=\left[\cos\theta,\mathbf{u}\sin\theta\right]\),且 \(\|\mathbf{u}\|=1\),那么:
\[ q^2=qq=\left[\cos 2\theta,\mathbf{u}\sin 2\theta\right] \]
在证明之前我们可以简单思考一下,\(q\) 表示绕 \(\mathbf{u}\) 旋转 \(\theta\),那么 \(q^2\) 表示绕 \(\mathbf{u}\) 旋转 \(2\theta\),这是不是很合理?
证明:
\[ \begin{align*} q^2 & =[\cos \theta, \mathbf{u}\sin \theta] [\cos \theta, \mathbf{u}\sin \theta] \\ & =\left[\cos ^2\theta-(\mathbf{u}\sin \theta) \cdot (\mathbf{u} \sin \theta ),(\cos \theta \sin \theta+\sin \theta \cos \theta) \mathbf{u}+(\sin \theta \mathbf{u}) \times (\sin \theta \mathbf{u})\right] \\ & =\left[\cos ^2\theta-\|\mathbf{u}\|^2\sin ^2\theta, 2 \mathbf{u}\sin \theta \cos \theta +\mathbf{0}\right] \\ & =\left[\cos ^2\theta-\sin ^2\theta, 2 \mathbf{u} \sin \theta \cos \theta \right] \\ & =[\cos 2 \theta, \mathbf{u} \sin 2 \theta ] \end{align*} \]
接下来利用上面的引理,我们可以对 \(v'\) 进行简化,先令 \(p=\left[\cos \frac{\theta}{2}, \mathbf{u} \sin \frac{\theta}{2}\right]\),显然 \(q = p^2\) 且 \(\|p\|=1\),即 \(p^{-1}=p^{\star}\) 那么:
\[ \begin{align*} v'&=v_{\parallel}+qv_{\perp}\\ &=pp^{-1}v_{\parallel} + ppv_{\perp}\\ &=pp^{\star}v_{\parallel} + ppv_{\perp} \end{align*} \]
继续简化之前来看第二个引理:
引理 2:对于平行于 \(\mathbf{u}\) 的向量 \(\mathbf{v}_{\parallel}\),其四元数为:\(v_{\parallel}=\left[0,\mathbf{v}_{\parallel}\right]\),且 \(\|\mathbf{u}\|=1\)。设 \(q=\left[\alpha,\beta \mathbf{u}\right]\),那么:\(qv_{\parallel}=v_{\parallel}q\)
证明:
\[ \begin{align*} \text{LHS} &= qv_{\parallel} \\ &= \left[\alpha,\beta \mathbf{u}\right]\left[0,\mathbf{v}_{\parallel}\right]\\ &= \left[-\beta \mathbf{u}\cdot \mathbf{v}_{\parallel}, \alpha \mathbf{v}_{\parallel}\right] \end{align*} \]
\[ \begin{align*} \text{RHS} &= v_{\parallel}q \\ &= \left[0,\mathbf{v}_{\parallel}\right]\left[\alpha,\beta \mathbf{u}\right]\\ &= \left[-\beta \mathbf{u}\cdot \mathbf{v}_{\parallel}, \alpha \mathbf{v}_{\parallel}\right] \end{align*} \]
引理 3:对于正交于 \(\mathbf{u}\) 的向量 \(\mathbf{v}_{\perp}\),其四元数为:\(v_{\perp}=\left[0,\mathbf{v}_{\perp}\right]\),且 \(\|\mathbf{u}\|=1\)。设 \(q=\left[\alpha,\beta \mathbf{u}\right]\),那么:\(qv_{\perp}=v_{\perp}q^{\star}\)
证明:
\[ \begin{align*} \text { LHS } & =q v_{\perp} \\ & =[\alpha, \beta \mathbf{u}] \left[0, \mathbf{v}_{\perp}\right] \\ & =\left[0-\beta \mathbf{u} \cdot \mathbf{v}_{\perp}, \alpha \mathbf{v}_{\perp}+\mathbf{0}+\beta \mathbf{u} \times \mathbf{v}_{\perp}\right] \\ & =\left[0, \alpha \mathbf{v}_{\perp}+\beta \mathbf{u} \times \mathbf{v}_{\perp}\right] \end{align*} \]
\[ \begin{align*} \mathrm{RHS} & =v_{\perp} q^{\star} \\ & =\left[0, \mathbf{v}_{\perp}\right][\alpha,-\beta \mathbf{u}] \\ & =\left[0+\mathbf{v}_{\perp} \cdot \beta \mathbf{u}, \mathbf{0}+\alpha \mathbf{v}_{\perp}+\mathbf{v}_{\perp} \times(-\beta \mathbf{u})\right] \\ & =\left[0, \alpha \mathbf{v}_{\perp}+\mathbf{v}_{\perp} \times(-\beta \mathbf{u})\right] \\ & =\left[0, \alpha \mathbf{v}_{\perp}-(-\beta \mathbf{u}) \times \mathbf{v}_{\perp}\right] \\ & =\left[0, \alpha \mathbf{v}_{\perp}+\beta \mathbf{u} \times \mathbf{v}_{\perp}\right] \end{align*} \]
现在,我们就能对之前的公式做出最后的变形了:
\[ \begin{align*} v' & =p p^{\star} v_{\|}+p p v_{\perp} \\ & =p v_{\|} p^*+p v_{\perp} p^{\star} \\ & =p\left(v_{\|}+v_{\perp}\right) p^{\star}\\ &= pvp^{\star} \end{align*} \]
到这里终于导出了四元数与 3D 旋转的关系,即:
任意向量 \(\mathbf{v}\) 绕以单位向量定义的旋转轴 \(\mathbf{u}\) 旋转 \(theta\) 度之后得到的 \(\mathbf{v}'\) 可以用四元数来表示。令 \(v=\left[0,\mathbf{0}\right]\),\(q=\left[\cos\frac{\theta}{2},\mathbf{u}\sin\frac{\theta}{2}\right]\),则:
\[ v'=q v q^{\star}=q v q^{-1} \]
这个公式非常简介,比矩阵形式的旋转变换要简单很多。
如果 \(q==\left[\cos\theta,\mathbf{u}\sin\theta\right]\),那么 \(q v q^{\star}\) 表示 \(\mathbf{v}\) 绕着 \(\mathbf{u}\) 旋转 \(2\theta\) 度。
再来看看这个公式,稍微变形下:
\[ v'=q v q^{\star}=qq^{\star}v_{\parallel}+qqv_{\perp}= v_{\parallel} + q^2v_{\perp} \]
也就是说,\(q v q^{\star}\) 这个变换实际上对平行于旋转轴的分量 \(v_{\parallel}\) 做的变换为 \(qq^{\star}\),相当于啥也没做。而对于正交于旋转轴的分量 \(v_{\perp}\) 则是做了两次变换 \(q^2=qq\),即旋转了 \(\frac{\theta}{2}+\frac{\theta}{2}=\theta\) 度。
实际上:
\[ qvq^{\star}=\left[0,\mathbf{v}\cos\theta + (1-\cos \theta)(\mathbf{u}\cdot \mathbf{v})\mathbf{u} +\left(\mathbf{u}\times\mathbf{v}\right) \sin \theta \right] \]
证明上述公式可能会用到:\(\mathbf{a}\times\left(\mathbf{b}\times \mathbf{c}\right)=\left(\mathbf{a}\cdot \mathbf{c}\right)\mathbf{b}-\left(\mathbf{a}\cdot \mathbf{b}\right)\mathbf{c}\)
如果有一个单位四元数 \(q=\left[a,\mathbf{b}\right]\),我们像获取它对应的旋转角度和旋转轴,可以直接得到:
$$ \[\begin{align*} \frac{\theta}{2}&=\arccos a\\ \mathbf{u}&=\frac{\mathbf{b}}{\sin \frac{\theta}{2}}=\frac{\mathbf{b}}{\sin \arccos a} \end{align*}\] $$
3D 旋转的矩阵形式
在实际的应用中,我们可能会需要将旋转与平移和缩放进行复合,所以需 要用到四元数旋转的矩阵形式。前面讨论过,左乘一个四元数 \(q=a+b \mathrm{i} + c \mathrm{j} + d \mathrm{k}\) 等同于下面这个矩阵:
\[ L\left(q\right)=\begin{bmatrix} a & -b & -c & -d \\ b & a & -d & c \\ c & d & a & -b \\ d & -c & b & a \\ \end{bmatrix} \]
而右乘 \(q\) 等价于:
\[ R\left(q\right)=\begin{bmatrix} a & -b & -c & -d \\ b & a & d & -c \\ c & -d & a & -b \\ d & c & -b & a \\ \end{bmatrix} \]
所以,我们可以利用这两个公式将 \(v'=qvq^{\star}\) 写成矩阵形式。设 \(a=\cos \frac{\theta}{2}\)、\(b=u_x\sin\frac{\theta}{2}\)、\(c=u_y\sin\frac{\theta}{2}\)、\(d=u_z\sin\frac{\theta}{2}\)、\(q=a+b \mathbf{i} + c \mathbf{j} + d \mathbf{k}\) 则:
\[ \begin{align*} q v q^{\star}&=L(q) R\left(q^*\right) v \\ & =\begin{bmatrix} a & -b & -c & -d \\ b & a & -d & c \\ c & d & a & -b \\ d & -c & b & a \end{bmatrix}\begin{bmatrix} a & b & c & d \\ -b & a & -d & c \\ -c & d & a & -b \\ -d & -c & b & a \end{bmatrix} v \\ & =\begin{bmatrix} a^2+b^2+c^2+d^2 & a b-a b-c d+c d & a c+b d-a c-b d & a d-b c+b c-a d \\ a b-a b+c d-c d & b^2+a^2-d^2-c^2 & b c-a d-a d+b c & b d+a c+b d+a c \\ a c-b d-a c+b d & b c+a d+a d+b c & c^2-d^2+a^2-b^2 & c d+c d-a b-a b \\ a d+b c-b c-a d & b d-a c+b d-a c & c d+c d+a b+a b & d^2-c^2-b^2+a^2 \end{bmatrix}v \\ \end{align*} \]
将 \(a^2+b^2+c^2+d^2=1\),带入化简得:
\[ q v q^{\star}=\begin{bmatrix} 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 \end{bmatrix} v \]
我们就得到了矩阵形式得旋转公式:
任意向量 \(\mathbf{v}\) 绕以单位向量定义的旋转轴 \(\mathbf{u}\) 旋转 \(\theta\) 角度之后得 \(\mathbf{v}'\) 可以使用矩阵乘法来表示。令 \(a=\cos \frac{\theta}{2}\)、\(b=u_x\sin\frac{\theta}{2}\)、\(c=u_y\sin\frac{\theta}{2}\)、\(d=u_z\sin\frac{\theta}{2}\),则:
\[ \mathbf{v}'=\begin{bmatrix} 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 \end{bmatrix} \mathbf{v} \]
这就是 3D 旋转得矩阵形式。
旋转的复合
假设有两个表示旋转的四元数 \(q_1\)、\(q_2\),先对 \(v\) 进行 \(q_1\) 变换,在对 \(v\) 进行 \(q_2\) 变换,变换的结果是什么?
先进行 \(q_1\) 变换得到 \(v'\):
\[ v'=q_1vq_1^{\star} \]
在进行 \(q_2\) 变换得到 \(v''\):
\[ \begin{align*} v''&=q_2v'q_2^{\star}\\ &=q_2q_1vq_1^{\star}q_2^{\star} \end{align*} \]
考虑到对于四元数 \(q_1\) 和 \(q_2\),有
\[ q_1^{\star}q_2^{\star}=\left(q_2q_1\right)^{\star} \]
这个证明非常简单,只需把两边的 Grassmann 积算出来即可,这里就不证明了。
所以:
\[ v''=\left(q_2q_1v\right)\left(q_2q_1\right)^{\star} \]
也就是说,两次旋转可以先计算两个四元数的乘积,然后再对 \(v\) 进行变换。
需要注意的是,\(q_2q_1\) 这个旋转变换不是分别沿着 \(q_1\) 和 \(q_2\) 两个旋转轴旋转两次,而是沿着一个全新的旋转轴进行一次旋转,不过结果是一样的
同样地,进行三次旋转:
\[ v'''=\left(q_3q_2q_1v\right)\left(q_3q_2q_1\right)^{\star} \]
双倍覆盖
四元数与 3D 旋转的关系不是一一对应的。例如,四元数 \(q\) 和 \(-q\) 表示同一个旋转。如果 \(q\) 表示绕着旋转轴 \(\mathbf{u}\) 旋转 \(\theta\) 度,则 \(-q\) 表示沿着旋转轴 \(-\mathbf{u}\) 旋转 \(2\pi-\theta\) 度。
\[ \begin{align*} -q&=\left[-\cos\frac{\theta}{2},-\mathbf{u}\sin\frac{\theta}{2}\right]\\ &=\left[\cos \left(\pi-\frac{\theta}{2}\right),(-\mathbf{u})\sin\left(\pi-\frac{\theta}{2}\right)\right] \end{align*} \]
即:这个四元数旋转角度为:\(2\left(\pi-\frac{\theta}{2}\right)=2\pi-\theta\),从下图可以看出,\(q\) 和 \(-q\) 表示同一个旋转。
其实从四元数的旋转公式也能到初同样的结果:
\[ (-q)v(-q)^{\star}=(-1)^2qvq^{\star}=qvq^{\star} \]
所以,单位四元数与 3D 旋转有一个「2 对 1 Surjective Homomorphism)」的关系,或者说单位四元数双倍覆盖了 3D 旋转。
指数形式
类似与复数,四元数也有指数形式。如果 \(\mathbf{u}\) 是一个单位向量,那么对单位四元数 \(u=\left[0,\mathbf{u}\right]\),有:
\[ \mathrm{e}^{u\theta}=\cos\theta +u\sin\theta=\cos\theta+\mathbf{u}\sin\theta \]
也就是说,四元数 \(q=\left[\cos\theta,\mathbf{u}\sin\theta\right]\) 可以使用指数表示为:\(\mathrm{e}^{u\theta}\).
那么任意向量 \(v\) 绕以单位向量 \(\mathbf{u}\) 旋转 \(\theta\) 角度之后得到的 \(v'\) 可以使用四元数的指数表示。设 \(v=\left[0,\mathbf{v}\right]\)、\(u=\left[0,\mathbf{u}\right]\),则:
\[ v'=\mathrm{e}^{u\theta}v\mathrm{e}^{-u\theta} \]
有了四元数的指数定义,我们就可以定义四元数的更多运算了。首先是自然对数,对于任意单位四元数 \(q=\left[\cos\theta,\mathbf{u}\sin\theta\right]\):
\[ \ln q=\ln(\mathrm{e}^{u\theta})=\left[0,\mathbf{u}\theta\right] \]
也可以定义四元数的幂运算:
\[ q^t=\left(\mathrm{e}^{u\theta}\right)^t=\mathrm{e}^{u(\theta t)}=\left[\cos t\theta,\mathbf{u}\sin t\theta\right] \]
四元数插值
\[ q_t=\mathrm{Slerp}\left(q_0,q_1,y\right) = \left(q_1q_0^{\star}\right)^tq_0 \]
先就这样吧,更多细节以后再补充。