1. 数学定义
在进行四元数对旋转的作用探讨前,我们先看一下四元数的定义,并不管三七二十一扔出一堆公式以供后续使用。首先四元数是一种超复数,与简单复数仅包含一个虚部$i$,四元数包含三个虚部$i,j,k$和一个实部,这里定义四元数入下:
于是可以有如下的运算:
Addition: $\hat{\textbf{q}}+\hat{\textbf{r}}=(\textbf{q}_v, q_w)+(\textbf{r}_v, r_w) = (\textbf{q}_v+\textbf{r}_v,q_w+r_w)$
Multiplication: $\hat{\textbf{q}}\hat{\textbf{r}}=(iq_x+jq_y+kq_z+q_w)(ir_x+jr_y+kr_z+r_w) =(\textbf{q}_v\times\textbf{r}_v+r_w\textbf{q}_v+q_w\textbf{r}_v, q_wr_w-\textbf{q}_v\cdot\textbf{r}_v)$
Conjugate: $\hat{\textbf{q}}^*=(-\textbf{q}_v, q_w)$
Norm: $n(\hat{\textbf{q}})=\sqrt{\hat{\textbf{q}}\hat{\textbf{q}}^*}=\sqrt{\hat{\textbf{q}}^*\hat{\textbf{q}}}=\sqrt{\textbf{q}_v\cdot\textbf{q}_v+q_w^2}=\sqrt{q_x^2+q_y^2+q_z^2+q_w^2}$
Identity: $\hat{\textbf{i}}=(\textbf{0}, 1)$
Inverse: $\hat{\textbf{q}}^{-1}=\frac{1}{n(\hat{\textbf{q}})^2}\hat{\textbf{q}}^*$
然后我们可以定义单位向量为:
于是可以扩展出如下定义:
Logarithm: $log(\hat{\textbf{q}})=\phi\textbf{u}_q$
Power: $\hat{\textbf{q}}^t=e^{\phi t\textbf{u}_q}=sin(\phi t)\textbf{u}_q + cos(\phi t)$
2. 旋转
现在我们有了四元数的定义,考虑有一个单位四元数$\hat{\textbf{q}}=(sin\phi \textbf{u}_q, cos\phi)$,和一个希望进行旋转的坐标$\textbf{p}=(p_x\ p_y\ p_z\ p_w)^T$,并将其装载为四元数$\hat{\textbf{p}}$,于是可以发现如下的公式:
那么这个公式做了什么事呢,先将绕轴旋转的图拿出来如下:
首先可以发现如下的结果:
接下来即可以尝试将上述公式展开
:
显然,该式实部未改变$p_w$的值,而虚部刚好使$(p_x, p_y, p_z)^T$按照单位轴$\textbf{u}_q$旋转了$2\phi$,如下图所示:
并且容易验证$\hat{\textbf{q}}$和$-\hat{\textbf{q}}$表示的是同种旋转。
所以最终我们可以将空间内绕轴$\textbf{u}_q$旋转$\phi$角度的四元数表示为如下形式:
3. 四元数->旋转矩阵
接下来我们需要将四元数表示为方便计算的旋转矩阵形式。上一步中我们已经展示了$\hat{\textbf{q}}\hat{\textbf{p}}\hat{\textbf{q}}^{*} $能够将$\textbf{p}$进行旋转,要得到旋转矩阵,我们尝试将$\textbf{p}_v$从中剥离出来,进行这一步前,先对如下条件进行说明:
然后开始进行剥离:
当然,另一种直接基于矩阵的计算方式或许更直观,将四元数的左乘直接写作如下形式:
同样地,右乘也可以表示为:
4. 旋转矩阵->四元数
那么当我们拿到如下的旋转矩阵:
5. 球面线性插值
我们可以对任意两个四元数进行插值,简单地表示如下:
即两个旋转的线性组合,但要表示为更容易计算的方式,则是四维单位球上进行球面线性插值其思想是以起点构造基坐标,然后进行施密特正交化,于是即可以如下地得到线性插值结果:
其中$cos\phi=\textbf{q}_0\cdot\textbf{q}_1$。
可以看到相较于欧拉角,任意两个四元数都可以得到稳定的插值结果。
6. 向量旋转
很多时候我们希望将向量$\textbf{s}$旋转到向量$\textbf{t}$,并且希望旋转的路径越小越好(即暗示了路径是一条优弧)。那么根据轴向角的方式就很容易描述这个过程了,如下图所示:
首先有$\textbf{u}=\frac{\textbf{s}\times\textbf{t}}{||\textbf{s}\times\textbf{t}||}=\frac{\textbf{s}\times\textbf{t}}{sin\theta}$,$e=\textbf{s}\cdot\textbf{t}=cos\theta$,于是可以用四元数表示旋转:
需要注意的是仅当$\textbf{s}$和$\textbf{t}$相反时,上述计算会出现问题。
参考文献
Real-Time Rendering (4th Edition)