本文最后更新于:2025年5月13日 晚上
旋转的表达方式有很多种,有欧拉角,旋转矩阵,轴角,四元素等等,四元数是一种描述 3维空间旋转角度的一种方法,本文记录相关内容。
从欧拉角和轴向角
我们先来看下简单的欧拉角和轴向角。
1. 欧拉角
欧拉角使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为0-360(或者0-2pi),一般使用roll,pitch,yaw来表示这些分量的旋转值。需要注意的是,这里的旋转是针对世界坐标系说的,这意味着第一次的旋转不会影响第二、三次的转轴。
欧拉角容易出现的问题是:
- 不易在任意方向的旋转轴插值;
- 万向节死锁;
- 旋转的次序无法确定。
2. 轴角
轴角用一个以单位矢量定义的旋转角,再加上一个标量定义的旋转角来表示旋转。通常的表示 $[x,y,z,\theta] $,前面三个表示轴,最后一个表示角度。表示非常直观,也很紧凑。
轴角最大的一个局限就是不能进行简单的插值,此外,轴角形式的旋转不能直接施于点或矢量,必转换为矩阵或者四元数。
四元数背景
四元数由汉密尔顿发明,这一发明起源于十九世纪的某一天。在这一天早上,汉密尔顿下楼吃早饭。这时他的儿子问他,“爸爸,我们能够对三元数组(triplet,可以理解为三维向量)做乘法运算么?”汉密尔顿说“不行,我只能加减它们。”
十九世纪的汉密尔顿也许确实不知道内积和外积,但是他知道,他想要的三维向量乘法要比内积和外积运算“高大上”很多。这一乘法运算要满足下列四条性质:
-
运算产生的结果也要是三维向量
-
存在一个元运算,任何三维向量进行元运算的结果就是其本身
-
对于任何一个运算,都存在一个逆运算,这两个运算的积是元运算
-
运算满足结合律
换而言之,汉密尔顿想定义的不是一个简单的映射关系,而是一个群!(后来我们知道四元数所在群为S3,而四元数所代表的三维旋转是SO(3),前者是后者的两倍覆盖)内积连性质1都不满足,外积不满足性质3。
汉密尔顿先生就这么被自己儿子提出的问题难倒了。经历了无数个日日夜夜,他绞尽脑汁也没想明白这个问题。终于有一天(1843年的一天),汉密尔顿先生终于意识到了,自己所需要的运算在三维空间中是不可能实现的,但在四维空间中是可以的,他是如此的兴奋,以至于把四元数的公式刻在了爱尔兰的一座桥上。
那么为什么我们需要四元数?一种说法是解决向量乘法,我们知道向量之间乘法有内积和外积,但这两个运算均不完美,即不满足群的条件(当然四元数诞生的时候也还没有内积外积的说法)。那向量之间是否存在这样一个非常完美的乘法,于是三维空间无法解决的问题就映射到四维空间。这便是四元数诞生的契机。
既然四元数只是为了解决矩阵乘法,那为什么我们现在要用四元数进行旋转,甚至替代了欧拉角、轴角等形式?首先,四元数并不是生来为了解决三维旋转,而是它的性质非常有利于表达旋转信息(后面会详述),所以了解四元数的性质要先于了解四元数在旋转中的应用。至于四元数替代欧拉角等形式,就需要牵扯到一些别的知识点,这里罗列一下四元数相比其他形式的优点:
- 解决万向节死锁(Gimbal Lock)问题
- 仅需存储4个浮点数,相比矩阵更加轻量
- 四元数无论是求逆、串联等操作,相比矩阵更加高效
所以综合考虑,现在主流游戏或动画引擎都会以缩放向量+旋转四元数+平移向量的形式进行存储角色的运动数据。
思想来源
空间中的子空间 : 一般而言,空间(维度>2)都存在更低维的子空间,比如二维空间中一维子空间,也就是直线;三维空间中的一维子空间和二维子空间,也就是直线和面。当超过三维的概念我们就很难去想象是什么样子,但四维空间一定会存在三维子空间或二维子空间。我们这里会加一个前缀超(hyper)来形容这些空间,比如高维空间中的平面我们称为超平面。
空间和子空间的映射: 我们将二维空间表示为(x,y),当y=0时,其实可以看成是一维的,只不过它表示成(x,0)这种形式。推到四维,(w,x,y,z),当w=0时,(0,x,y,z)就是一个三维子空间,这也是为什么我们可以用单位四元数对三维向量进行操作,其实我们是将三维向量映射到四维的三维子空间(w=0,这种形式也成纯四元数),然后对其进行旋转,最终得到的向量结果依然是这个三维子空间中的,因而可以映射回三维空间。
广义球: 这里的球是广义上的。我们在二维平面上,广义球其实指代circle,三维空间上就是我们认知上的球,称为two-sphere,而四维空间中广义球其实是一个超球(hyper-sphere),又称为 three-sphere。单位向量其实就是广义球上面的点,而单位四元数也就是three-sphere上面的点。
约束与特征向量: 空间中的一点由 x, y, z 等参数来表示,一般来说参数的数量与维数相等,二维空间的点用{x, y}参数,四维空间的点用{x, y, z, w}参数。但是对于空间的点加以约束,则该会减少参数的数量,比如三维空间的点在某一单位球面上,原本三个参数{x, y, z}才能表达的点现在只需要两个参数{u, v}就可以表达。如果{u, v}是单位向量,也可以称{u, v}是{x, y, z}的特征向量。
上述概念给了大家一个思路,四元数这样一个东西并不是一蹴而就的,从空间来说,它与我们熟知的低维空间本质上是没有区别的,或者说是有很大共性的。四元数的很多特性都是从低维拓展而来的,更具体的说是从复数这一概念拓展的。
复数概念很简单,它其实就是为了满足数学家的强迫症,-1的平方根要有意义。看似很没有意义的复数,在实际中却用处非凡。我们首先看一下它的几何表达形式,令x为实部,y为虚部,则x+iy可以表示为下图。
复数的提出将原本一维的数值范围直接加了一个维度,数据量的增幅可以说是巨大的。那我们从极坐标的角度去思考复数,x+i·y可以写成r·cosθ+i·r·sinθ,我们只考虑单位复数,|r|=1,也就得到cosθ+i·sinθ。说到这,就要提一个代数学中常用的公式——欧拉公式,基本上复数的所有运算推到都会用到这个公式。
$$ \begin{aligned}\text{z}&=x+iy\\ &=r\cos\theta+ir\sin\theta\\ &=re^{i\theta}\end{aligned} $$四元数的推导
正如复数是有一个实部和一个虚部组成的,那我们将一个虚部换成三个虚部,即两两相交{i, j, k}。
$$ \begin{aligned}e^{\mathbf{i}\cdot\mathbf{\hat{n}}\theta/2} &=\cos(\theta/2)+\mathbf{i}\cdot\mathbf{\hat{n}}\sin(\theta/2)\\ &=q_0+\mathbf{i}\cdot\mathbf{q}\\ &=q_0+iq_1+jq_2+kq_3,\end{aligned} $$其中n为三维的单位向量,$i²=j²=k²=i·j·k=-1$。这便是四元数的常规表达形式,不过单位四元数是有一大堆的约束的,并不是所有四维向量都是四元数。
这里再开一个脑洞,可能大家听说四元数、八元数,但是存在三元数、五元数?其实从客观上说,三元数、四元数、n元数都是存在的(也就是复数存在无穷个等级),但并不是所有的数系都满足模运算。而且随着维度的提高,特性会逐步牺牲,相比复数运算,四元数牺牲了交换律;相比四元数运算,八元数牺牲了结合律。当然也还存在十六元数,不过十六元数的特性将更少,在数学中也就更加没有意义,所以目前就四元数的应用最为广泛。
理解四元数
在我们总结一下已经得出的四元数特性:
- 四元数(以后不特指四元数=单位四元数)是四维空间中一个超球上面的点,满足 w²+x²+y²+z²=1;而纯四元数是四维空间在w=0时的一个子空间的点,形式为{0, q},特别注意的是纯四元数与四元数是不同的概念。
- 四元数是复数虚部扩展的结果,复数的虚部为1个,而四元数虚部有3个,且两两互相正交,其中实部是cosθ/2,而虚部为一个単位轴乘以sinθ/2。
- 四元数自由度并没有四个维度,由于存在 w²+x²+y²+z²=1这个约束,它的自由度其实只有3,且每个四元数可以对应一个特征向量,即n。但请记住四元数并不是与特征向量一一对应的,后文会有说。
由于四元数存在于四维空间,所以如何利用低维信息去理解高维信息就显得尤为重要。我们这里先用三维举个例子,三维的球用代数表示为x²+y²+z²=1,虽然球上面的点是由x,y,z三个参数来确定,但实际上我们只需要两个。假设取x和z表示,其中y可以通过x和z进行求解。那么,我们将y轴信息给隐去,只看投影平面,如下图所示。这张图的意思是,整个球在XOZ平面上投影是一个圆,当球面一点投影在圆上时,y=0;投影的位置位于圆内时,则分别两种情况,y>0处于北半球,y<0 处于南半球。所以我们仅通过投影后的圆即可还原出整个球体。
让我们推广到四维,w²+x²+y²+z²=1 中取x、y和z来表示超球。如下图所示,四维空间投影到三维超平面(w=0)可能是一个two-sphere。当投影点在整个two-sphere的边缘时,w一定为0,值得一提的是在这个空间内的四元数是一个纯四元数。当投影点落在two-sphere的内部时,也分为两种情况,w>0和w<0。但是我们可以发现这两种情况下对应的特征向量是一样的,所以我们将旋转矩阵向四元数转换时,是有两个对应值的,四元数的范围是2倍覆盖于3D旋转
四元素感觉上就是轴角的进化,也是使用一个3维向量表示转轴和一个角度分量表示绕此转轴的旋转角度,即(x,y,z,w),
四元数的“乘法”运算
由于四元数有i,j,k三个虚部,所以得满足 i²=j²=k²=i·j·k=-1 这个条件。这里令★为“乘法”操作符,则p★q的公式如下
$$ \begin{aligned}p\star q&=(p_{0},p_{1},p_{2},p_{3})\star(q_{0},q_{1},q_{2},q_{3})\\ &=\begin{bmatrix}p_0q_0-p_1q_1-p_2q_2-p_3q_3\\p_1q_0+p_0q_1+p_2q_3-p_3q_2\\p_2q_0+p_0q_2+p_3q_1-p_1q_3\\p_3q_0+p_0q_3+p_1q_2-p_2q_1\end{bmatrix}\\&=(p_0q_0-\mathbf{p}\cdot\mathbf{q},p_0\mathbf{q}+q_0\mathbf{p}+\mathbf{p}\times\mathbf{q})\end{aligned} $$我们首先针对单位四元数,按照群的性质一条条过:
- 封闭性:易证明,p和p的共轭相乘即可,|p★q|=1。
- 结合律:这条也很好证明,只要证明 (p★q)★r=p★(q★r)。
从几何的角度思考,由于单位四元数旋转后还是单位四元数,所以满足封闭性。
同时,类比矩阵乘法,单位四元数也应该满足结合律。
- 单位元素:e=(1,0,0,0),这也是四元数的一个初始值(相当于单位矩阵)。带入上面的公式可知,p★(1,0,0,0)还是等于p。
- 逆元素:p存在一单位四元数,★操作的结果为e,具体参考下面公式,可以看出逆元素就是其共轭除以模的平方。
如果这里是复数,可能还会满足交换律,就是一个阿贝尔群。但四元数肯定不满足交换律,无论从代数的角度,还是从几何角度。到这里,基本也就介绍完了四元数的乘法运算,如果用其指数形式(exp形式),证明这些性质就会更简单。
四元数的指数、对数与内积
根据欧拉公式可知,四元数的指数形式只是换了一种表达方式,都是表达同一个东西。而其对数形式也就是四元数指数形式的指数,如下图公式所示。这对公式在计算四元数插值的时候很有用:
$$ \begin{aligned}&e^{(0,\mathbf{\hat{n}}\frac{\theta}{2})}=\left(\cos\frac{\theta}{2},\mathbf{\hat{n}}\sin\frac{\theta}{2}\right)\\&\log\left(\cos\frac{\theta}{2},\mathbf{\hat{n}}\sin\frac{\theta}{2}\right)=\left(0,\mathbf{\hat{n}}\frac{\theta}{2}\right)\end{aligned} $$那么对数和指数的关系是什么呢?我们参考下图,其实对数的变化量其实就是角度的大小,所以用下图可以很直观的看出四元数指数形式和对数形式之间的关系。
最后介绍一下四元数的内积。我们先看三维空间或二维空间,如果两个单位向量算内积,内积的结果为两个向量的夹角。四元数也是如此,两个单位四元数的内积就是其夹角,这个结论推广到n维也是成立,原因很简单,因为三点共面,即使n维空间,两个向量所在的空间也仅是二维子空间。至于外积,由于对于复数和四元数来说,外积的意义均不是很明显,这里就不做过多讨论。
直观理解四元数
我们对四元数的应用主要是三维空间的旋转,这里不加说明,以下所说四元数全为单位四元数。
四元数有四个变量,完全可以被看作一个四维向量。单位四元数(norm=1)则存在于四维空间的一个球面上。$q_{a}q_{b}$,四元数$q_{a}$ 乘以四元数 $q_{b}$ 其实可以看作:
对$q_{a}$ 进行 $q_{b}$ 左旋转,或者对 $q_{b}$ 进行 $q_{a}$ 右旋转。
所以从始至终,四元数定义的都是四维旋转,而不是三维旋转,任意的四维旋转都可以唯一的拆分为一个左旋转和一个右旋转,表达出来就是$q_{{L}}pq{{R}}$。这里,我们对四元数(四维向量)$p$ 进行了一个$q{{L}}$左旋转和一个 $q{_{R}}$ 右旋转。
说回三维旋转,三维旋转就是四维旋转的一个特例,就像二维旋转是三维旋转的一个特例一样。说是特例其实不准确,准确的说是一个子集或者subgroup。为了进行三维旋转运算,汉密尔顿首先在四维空间里划出了一块三维空间。汉密尔顿定义了一种纯四元数(pure quaternion),其表达式为 $qw=(0,wx,wy,wz)$。纯四元数第一项为零,它存在于四维空间的三维超平面上,与三维空间中的三维向量一一对应。然后,就有了我们常见的 $qqwq^{-1} $ 这种左乘单位四元数,右乘其共轭的表达式。我真心不知道汉密尔顿是怎么想出来的,不过回过头来看,这个运算形式是为了限制其运算结果所在的空间。简单的说,当对一个三维向量进行三维旋转后,我们希望得到的是一个三维向量。(如果你真能得到一个四维向量,就不敢自己在家转圈圈了吧,转着转着,就进入四次元了!)那么这个左乘单位四元数,右乘其共轭的运算保证了结果是一个在三维超平面上中的纯四元数。
把左乘和右乘表达为矩阵形式会让我们看的更清楚一些。依照 $𝑞𝑤$ 的定义,$𝑞∗𝑞𝑤∗𝑞^{−1}$的矩阵形式为
$$ \begin{bmatrix}1&0&0&0\\0&q_1^2+q_2^2-q_3^2-q_4^2&2q_2q_3-2q_1q_4&2q_2q_4+2q_1q_3\\0&2q_2q_3+2q_1q_4&q_1^2-q_2^2+q_3^2-q_4^2&2q_3q_4-2q_1q_2\\0&2q_2q_4-2q_1q_3&2q_3q_4+2q_1q_2&q_1^2-q_2^2-q_3^2+q_4^2\end{bmatrix}\begin{bmatrix}0\\wx\\wy\\wz\end{bmatrix} $$很明显,前面的矩阵虽然是一个4x4的四维旋转矩阵,但是它只是在右下角3x3的区域内和一个单位矩阵有所不同。所以说,它是一个限制在三维超平面上的四维旋转。如果表达式右边不是共轭,而是任意四元数,那么我们所作的就是一个很普通的四维旋转。如果只是左乘一个单位四元数,右边什么都不乘,那么我们得到的是四维旋转的一个子集,这个子集并不能保证结果限制在三维超平面上。如果只右乘,不左乘也是一样一样的。
其实这张图解释了一个长久的疑问。为什么四元数 $q=(cos(\frac\theta2),sin(\frac\theta2)*vx,sin(\frac\theta2)*vy,sin(\frac\theta2)*vz)$ 里用的是 $\frac\theta2$ 而不是 $\theta$。这是因为 $q$ 做的就是一个$\frac\theta2$ 的旋转,而 $q^{-1}$ 也做了一个$\frac\theta2$的旋转。我们进行了两次旋转,而不是一次,这两次旋转的结果是一个旋转角为 $\theta$ 的旋转。
四元数信息整理
基本定义
四元数是一种扩展的复数系统,由实部和三个虚部组成,形式为:
$$
q = a + bi + cj + dk
$$
其中:
a
为实部bi, cj, dk
为虚部i² = j² = k² = ijk = -1
(虚数单位关系)
几何意义:
- 四元数可表示三维空间中的旋转方向和角度
- 虚部
(b,c,d)
对应旋转轴方向 - 实部
a
与旋转角度相关
运算规则
1. 基本运算
运算类型 | 公式 | 说明 |
---|---|---|
加法 | q₁ + q₂ = (a₁+a₂) + (b₁+b₂)i + (c₁+c₂)j + (d₁+d₂)k |
对应分量相加 |
标量乘法 | s⋅q = sa + sbi + scj + sdk |
标量与各分量相乘 |
共轭 | q* = a - bi - cj - dk |
虚部符号取反 |
模长 | \|\|q\|\| = √(a² + b² + c² + d²) | 四元数的"长度 |
单位化 | Normalize( q ) = q/ \| q \| = q / (x2 + y2 + z2 + w2) | 标准化四元数 (x,y,z,w) |
2. 四元数乘法
四元数乘积公式:
$$ q₁q₂ = (a₁a₂ - b₁b₂ - c₁c₂ - d₁d₂ ) + (a₁b₂ + b₁a₂ + c₁d₂ - d₁c₂ )i + (a₁c₂ - b₁d₂ + c₁a₂ + d₁b₂ )j + (a₁d₂ + b₁c₂ - c₁b₂ + d₁a₂ )k $$跟随以下的乘数表:
几何意义:相当于连续应用两次旋转操作
欧拉角到四元数
给定一个欧拉旋转(X, Y, Z)(即分别绕x轴、y轴和z轴旋转X、Y、Z度),则对应的四元数为:
$$ \begin{aligned}&\mathrm{x}=\sin(\mathrm{Y}/2)\mathrm{sin}(\mathrm{Z}/2)\mathrm{cos}(\mathrm{X}/2)+\mathrm{cos}(\mathrm{Y}/2)\mathrm{cos}(\mathrm{Z}/2)\mathrm{sin}(\mathrm{X}/2)\\&\mathrm{y}=\sin(\mathrm{Y}/2)\mathrm{cos}(\mathrm{Z}/2)\mathrm{cos}(\mathrm{X}/2)+\mathrm{cos}(\mathrm{Y}/2)\mathrm{sin}(\mathrm{Z}/2)\mathrm{sin}(\mathrm{X}/2)\\&\mathrm{z}=\cos(\mathrm{Y}/2)\mathrm{sin}(\mathrm{Z}/2)\mathrm{cos}(\mathrm{X}/2)-\mathrm{sin}(\mathrm{Y}/2)\mathrm{cos}(\mathrm{Z}/2)\mathrm{sin}(\mathrm{X}/2)\\&\mathrm{w}=\cos(\mathrm{Y}/2)\mathrm{cos}(\mathrm{Z}/2)\mathrm{cos}(\mathrm{X}/2)-\mathrm{sin}(\mathrm{Y}/2)\mathrm{sin}(\mathrm{Z}/2)\mathrm{sin}(\mathrm{X}/2)\\&\mathrm{q}=((x,y,z),w)\end{aligned} $$轴角到四元数
给定一个单位长度的旋转轴(x, y, z)和一个角度θ。对应的四元数为:
$$ \mathrm q=((\mathrm x,\mathrm y,\mathrm z)\sin\frac{\theta}{2},\:\cos\frac{\theta}{2}) $$四元数与3D旋转
1. 旋转表示方法
任意三维旋转可用轴-角形式表示为四元数:
$$
q = [cos(θ/2), sin(θ/2)⋅(x,y,z)]
$$
其中:
θ
:旋转角度(x,y,z)
:单位旋转轴方向向量
2. 向量旋转公式
对向量 v=(vx,vy,vz)
应用旋转:
- 将向量转换为纯四元数:
p = [0, vx, vy, vz]
- 计算旋转后的四元数:
p' = qpq⁻¹
- 提取结果向量:
v' = (p'.i, p'.j, p'.k)
对比其他旋转表示法
方法 | 优点 | 缺点 |
---|---|---|
欧拉角 | 直观易理解 | 存在万向节死锁(Gimbal Lock) |
旋转矩阵 | 可直接叠加变换 | 存储冗余(9个参数) |
四元数 | 无万向节死锁,插值平滑 | 学习曲线较陡峭:ml-citation{ref=“2,3” data=“citationList”} |
重要特性
- 单位四元数
表示纯旋转的四元数需满足:
$$
||q|| = √(a² + b² + c² + d²) = 1
$$
此时逆运算为 q⁻¹ = q*
- 插值优势
可通过球面线性插值(SLERP)实现平滑旋转过渡:
$$
q(t) = (q₁sin((1-t)θ) + q₂sin(tθ)) / sinθ
$$
避免欧拉角插值的不连续问题
注意事项
1. 单位化处理
反复运算可能导致四元数模长变化,需定期归一化:
1 |
|
2. 存储优化
实际应用中常存储(b,c,d)
三个分量,通过计算 a = √(1 - b² - c² - d²)
还原
参考资料
- https://zhuanlan.zhihu.com/p/27471300
- https://www.zhihu.com/question/23005815/answer/33971127
- https://blog.csdn.net/silangquan/article/details/39008903
- https://www.bilibili.com/video/BV1SW411y7W1/?share_source=copy_web&vd_source=8ee219651c85ad2dcb7767effc5919a7
- https://www.cnblogs.com/jins-note/p/9512719.html
- https://blog.csdn.net/silangquan/article/details/39008903
文章链接:
https://www.zywvvd.com/notes/3d/quaternions-intr/quaternions-intr/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信支付

支付宝支付