1 引言
本文将对四元数的基本概念进行介绍,并将详细介绍四元数与欧拉角、四元数与旋转矩阵之间的相互转换。另外还将介绍如何使用四元数旋转对象,以及以及如何将多个旋转操作连接成一个四元数。
2 四元数的简单表示
一个四元数由四个元素表示:
\tag{1}
其中,q_{0}、q_{1}、q_{2}、q_{3}是实数,而i、j、k是相互正交的虚单位向量。q_{0}称为实分量,而q_{1}、q_{2}、q_{3}称为虚分量。在实际应用过程中(包括在本文中),一般隐藏虚单位向量,使用四个实数表示四元数:
\tag{2}
四元数本身是一个非常复杂的数学理论,在本文中只限于讨论用于3D旋转的四元数。旋转四元数是一种表示三维旋转的机制,可用作3D图形和其他应用程序中旋转矩阵的替代方案,而使用它们不需要了解复数。
旋转四元数与旋转的轴角表示密切相关。因此,我们将从解释轴角表示开始,然后展示如何转换为四元数。
3 3D旋转的轴角表示
根据欧拉旋转定理,可以使用两个参数指定任何3D旋转(或旋转序列),一个参数为定义旋转轴的单位向量,另一个参数为绕该旋转轴的旋转角度\theta,该方式如下图所示
因此,轴角旋转可以用四个数字表示,如下式
\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 ),而四元数如下所示:
\tag{4}
其中,
\tag{5}
\tag{6}
\tag{7}
\tag{8}
从上述方程中我们可以看出,四元数的实数项q_{0}完全是由旋转角度\theta所决定,其余三个虚数项q_{1}、q_{2}、q_{3}是三个旋转轴单位向量按比例缩放共同的比例的结果,这种表示的结果是四元数的大小,即四个分量q_{0}、q_{1}、q_{2}、q_{3}的平方和为1,即
\tag{9}
轴角和四元数都包含了同样的旋转信息,那我们为什么要使用不易理解的四元数呢?因为如果我们要对一个3D对象执行旋转操作,如果使用轴角就要进行较为复杂的三角函数运算,而四元数只需要执行简单的加法、减法、乘法来完成同样的3D旋转,而这在3D渲染这种实时性要求很强的领域可以节省大量的运算耗时,减少开销。
4.2 将四元数转换为轴角
给定四元数q=q_{0} +iq_{1}+jq_{2}+kq_{3},可以使用如下方式将四元数转换为轴角。
首先,需要从q_{0}中提取旋转角度\theta,
\tag{10}
如果\theta不等于0,我们可以得到下面公式得到旋转轴:
\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},对应的旋转矩阵为:
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}
或者
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_{11} & r_{12} & r_{13}\\
r_{21} & r_{22} & r_{23}\\
r_{31} & r_{32} & r_{33}
\end{bmatrix}
\tag{式14}
我们可以通过两个步骤将旋转矩阵转换为四元数。
第1步:得到未定义符号的四元数大小
\tag{式15}
\tag{式16}
\tag{式17}
\tag{式18}
第2步:为了判断正负符号,找到q0,q1,q2,q3的最大值,并且假设其符号为正。然后计算剩余分量,如下所示:
如果q0最大,则
\tag{式19}
\tag{式20}
\tag{式21}
如果q1最大,则
\tag{式22}
\tag{式23}
\tag{式24}
如果q2最大,则
\tag{式25}
\tag{式26}
\tag{式27}
如果q3最大,则
\tag{式28}
\tag{式29}
\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 将四元数转换为欧拉角
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:三维旋转 – 四元数的基本概念以及四元数与欧拉角、旋转矩阵的相互转换
原文链接:https://www.stubbornhuang.com/2126/
发布于:2022年05月12日 21:45:03
修改于:2023年06月26日 20:11:26
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
52