1 引言

本文将对四元数的基本概念进行介绍,并将详细介绍四元数与欧拉角、四元数与旋转矩阵之间的相互转换。另外还将介绍如何使用四元数旋转对象,以及以及如何将多个旋转操作连接成一个四元数。

2 四元数的简单表示

一个四元数由四个元素表示:

q=q_{0} +iq_{1}+jq_{2}+kq_{3}
\tag{1}

其中,q_{0}q_{1}q_{2}q_{3}是实数,而ijk是相互正交的虚单位向量。q_{0}称为实分量,而q_{1}q_{2}q_{3}称为虚分量。在实际应用过程中(包括在本文中),一般隐藏虚单位向量,使用四个实数表示四元数:

q=\left ( q_{0}, q_{1},q_{2},q_{3} \right )
\tag{2}

四元数本身是一个非常复杂的数学理论,在本文中只限于讨论用于3D旋转的四元数。旋转四元数是一种表示三维旋转的机制,可用作3D图形和其他应用程序中旋转矩阵的替代方案,而使用它们不需要了解复数。

旋转四元数与旋转的轴角表示密切相关。因此,我们将从解释轴角表示开始,然后展示如何转换为四元数。

3 3D旋转的轴角表示

根据欧拉旋转定理,可以使用两个参数指定任何3D旋转(或旋转序列),一个参数为定义旋转轴的单位向量,另一个参数为绕该旋转轴的旋转角度\theta,该方式如下图所示

三维旋转 – 四元数的基本概念以及四元数与欧拉角、旋转矩阵的相互转换-StubbornHuang Blog

因此,轴角旋转可以用四个数字表示,如下式

\left ( \theta ,\hat{x} ,\hat{y} ,\hat{z} \right )
\tag{3}

其中,\left (\hat{x} ,\hat{y} ,\hat{z} \right )是定义旋转轴的单位向量,\theta为围绕轴\left (\hat{x} ,\hat{y} ,\hat{z} \right )的旋转角度。

4 轴角与四元数的相互转换

4.1 将轴角转换为四元数

四元数可以使用轴角进行表示,如果已知轴角为\left ( \theta ,\hat{x} ,\hat{y} ,\hat{z} \right ),而四元数如下所示:

q=q_{0} +iq_{1}+jq_{2}+kq_{3}
\tag{4}

其中,

q_{0} = \cos \left ( \frac{\theta }{2} \right )
\tag{5}
q_{1} = \hat{x} \sin \left ( \frac{\theta }{2} \right )
\tag{6}
q_{2} = \hat{y} \sin \left ( \frac{\theta }{2} \right )
\tag{7}
q_{3} = \hat{z} \sin \left ( \frac{\theta }{2} \right )
\tag{8}

从上述方程中我们可以看出,四元数的实数项q_{0}完全是由旋转角度\theta所决定,其余三个虚数项q_{1}q_{2}q_{3}是三个旋转轴单位向量按比例缩放共同的比例的结果,这种表示的结果是四元数的大小,即四个分量q_{0}q_{1}q_{2}q_{3}的平方和为1,即

q_{0} ^{2} + q_{1} ^{2}+q_{2} ^{2}+q_{3} ^{2} = 1
\tag{9}

轴角和四元数都包含了同样的旋转信息,那我们为什么要使用不易理解的四元数呢?因为如果我们要对一个3D对象执行旋转操作,如果使用轴角就要进行较为复杂的三角函数运算,而四元数只需要执行简单的加法、减法、乘法来完成同样的3D旋转,而这在3D渲染这种实时性要求很强的领域可以节省大量的运算耗时,减少开销。

4.2 将四元数转换为轴角

给定四元数q=q_{0} +iq_{1}+jq_{2}+kq_{3},可以使用如下方式将四元数转换为轴角。
首先,需要从q_{0}中提取旋转角度\theta

\theta = 2 \cos ^{-1} \left ( q_{0} \right )
\tag{10}

如果\theta不等于0,我们可以得到下面公式得到旋转轴:

(\hat{x}, \hat{y}, \hat{z})=\left(\frac{q_{1}}{\sin \left(\frac{\theta}{2}\right)}, \frac{q_{2}}{\sin \left(\frac{\theta}{2}\right)}, \frac{q_{3}}{\sin \left(\frac{\theta}{2}\right)}\right)
\tag{11}

在一种特殊情况下,式11会转换失败。q=(1,0,0,0)称为恒等四元数,在四元数为恒等四元数时不会产生旋转,而当四元数为恒等四元数时,式10得到的\theta角将等于0,在没有旋转的情况下,旋转轴是不确定的,而式11会出现被0整除的问题,所以在实践过程中,必须检测q_{0}是否等于1,如果q_{0}=1,则将\theta设置为0,并且将旋转轴\left ( \hat{x} ,\hat{y} ,\hat{z} \right )设置为(1,0,0)

需要提出的,将四元数转换为轴角有很多方法,如果看到有转换方法与式10和式11不同,请不要太在意。

5 四元数与旋转矩阵的相互转换

5.1 将四元数转换为旋转矩阵

给定四元数q=q_{0} +iq_{1}+jq_{2}+kq_{3},对应的旋转矩阵为:

R=\left[\begin{array}{ccc}
q_{0}^{2}+q_{1}^{2}-q_{2}^{2}-q_{3}^{2} & 2 q_{1} q_{2}-2 q_{0} q_{3} & 2 q_{1} q_{3}+2 q_{0} q_{2} \\
2 q_{1} q_{2}+2 q_{0} q_{3} & q_{0}^{2}-q_{1}^{2}+q_{2}^{2}-q_{3}^{2} & 2 q_{2} q_{3}-2 q_{0} q_{1} \\
2 q_{1} q_{3}-2 q_{0} q_{2} & 2 q_{2} q_{3}+2 q_{0} q_{1} & q_{0}^{2}-q_{1}^{2}-q_{2}^{2}+q_{3}^{2}
\end{array}\right]
\tag{12}

或者

R=\left[\begin{array}{lll}
1-2 q_{2}^{2}-2 q_{3}^{2} & 2 q_{1} q_{2}-2 q_{0} q_{3} & 2 q_{1} q_{3}+2 q_{0} q_{2} \\
2 q_{1} q_{2}+2 q_{0} q_{3} & 1-2 q_{1}^{2}-2 q_{3}^{2} & 2 q_{2} q_{3}-2 q_{0} q_{1} \\
2 q_{1} q_{3}-2 q_{0} q_{2} & 2 q_{2} q_{3}+2 q_{0} q_{1} & 1-2 q_{1}^{2}-2 q_{2}^{2}
\end{array}\right]
\tag{13}

这两种方法都适用于四元数转换为对应的旋转矩阵,包括恒等四元数。

5.2 将旋转矩阵转换为四元数

给定旋转矩阵R:

R=\begin{bmatrix}
r_{11} & r_{12} & r_{13}\\
r_{21} & r_{22} & r_{23}\\
r_{31} & r_{32} & r_{33}
\end{bmatrix}
\tag{式14}

我们可以通过两个步骤将旋转矩阵转换为四元数。

第1步:得到未定义符号的四元数大小

\left | q_{0} \right | = \sqrt{\frac{1+r_{11}+r_{22}+r_{33} }{4} }
\tag{式15}
\left | q_{1} \right | = \sqrt{\frac{1+r_{11}-r_{22}-r_{33} }{4} }
\tag{式16}
\left | q_{2} \right | = \sqrt{\frac{1-r_{11}+r_{22}-r_{33} }{4} }
\tag{式17}
\left | q_{3} \right | = \sqrt{\frac{1-r_{11}-r_{22}+r_{33} }{4} }
\tag{式18}

第2步:为了判断正负符号,找到q0,q1,q2,q3的最大值,并且假设其符号为正。然后计算剩余分量,如下所示:

如果q0最大,则

q_{1} = \frac{r_{32}-r_{23} }{4q_{0} }
\tag{式19}
q_{2} = \frac{r_{13}-r_{31} }{4q_{0} }
\tag{式20}
q_{3} = \frac{r_{21}-r_{12} }{4q_{0} }
\tag{式21}

如果q1最大,则

q_{0} = \frac{r_{32}-r_{23} }{4q_{1} }
\tag{式22}
q_{2} = \frac{r_{12}+r_{21} }{4q_{1} }
\tag{式23}
q_{3} = \frac{r_{13}+r_{31} }{4q_{1} }
\tag{式24}

如果q2最大,则

q_{0} = \frac{r_{13}-r_{31} }{4q_{2} }
\tag{式25}
q_{1} = \frac{r_{12}+r_{21} }{4q_{2} }
\tag{式26}
q_{3} = \frac{r_{23}+r_{32} }{4q_{2} }
\tag{式27}

如果q3最大,则

q_{0} = \frac{r_{21}-r_{12} }{4q_{3} }
\tag{式28}
q_{1} = \frac{r_{13}+r_{31} }{4q_{3} }
\tag{式29}
q_{2} = \frac{r_{23}+r_{32} }{4q_{3} }
\tag{式30}

符号不明确的原因是任何给定的旋转都有两种可能的四元数表示。如果一个是已知的,则可以通过对所有四个项取负来找到另一个。这具有反转旋转角度和旋转轴的效果。所以对于四元数,q=\left ( q_{0}, q_{1},q_{2},q_{3} \right )q=\left ( -q_{0}, -q_{1},-q_{2},-q_{3} \right )表示相同的旋转。

6 四元数与欧拉角的相互转换

6.1 将欧拉角转换为四元数

6.2 将四元数转换为欧拉角