本文最后更新于:2025年4月17日 晚上
四元数
所有的四元数 q∈H 都可以写成下面这种形式:
q=a+bi+cj+dk,(a,b,c,d∈R)
其中
i2=j2=k2=ijk=−1
如果把上式称为四元数的代数形式,那么和复数类似,它也有对应的向量形式一:
q=abcd
如果将四元数 q 的实部和虚部分开,并用一个三维的向量来表示虚部,将它表示为标量和向量的有序对形式,那么四元数还可以表示为下述的向量形式二:
q=[s,v],(v=xyz,s,x,y,z∈R)
四元数的性质
四元数的模长
仿照复数模长的定义,我们可以暂时将四元数 q=a+bi+cj+dk 的模长定义为
∥q∥=a2+b2+c2+d2
如果用标量向量有序对的形式进行表示的话,q=[s,v] 的模长为:
∥q∥=s2+∥v∥2=s2+v⋅v
四元数的加减法
与复数类似,四元数的加法只需要将分量相加就可以了,如果我们有两个四元数 q1=a+bi+cj+dk,q2=e+fi+gj+hk,那么它们的和为
q1+q2=a+bi+cj+dk+e+fi+gj+hk=(a+e)+(b+f)i+(c+g)j+(d+h)k
减法同理,将加号改为减号就可以了
q1−q2=(a−e)+(b−f)i+(c−g)j+(d−h)k
如果四元数是以标量向量有序对形式定义的,比如说 q1=[s,v],q2=[t,u],那么
q1±q2=[s±t,v±u]
四元数的标量乘法
如果我们有一个四元数 q=a+bi+cj+dk 和一个标量 s,那么它们的乘积为:
sq=s(a+bi+cj+dk)=sa+sbi+scj+sdk
四元数与标量的乘法遵守交换律,也就是说 sq=qs
四元数乘法
四元数之间的乘法不遵守交换律,也就是说一般情况下 q1q2=q2q1。这也就有了左乘和右乘的区别,如果是 q1q2,我们就说"q2 左乘以 q1“,如果是 q2q1,那我们就说"q2 右乘以 q1”。除了交换律之外,结合律和分配律在四元数内都是成立的。
如果有两个四元数 q1=a+bi+cj+dk 和 q2=e+fi+gj+hk,那么
q1q2=(a+bi+cj+dk)(e+fi+gj+hk)=ae+afi+agj+ahk+bei+bfi2+bgij+bhik+cej+cfji+cgj2+chjk+dek+dfki+dgkj+dhk2
由 i2=j2=k2=ijk=−1 我们可以推导出 jk=i,ij=k,ki=j,kj=−i,ji=−k,ik=−j,于是我们可以得到:

容易观察到交换律并不成立。利用上面的表格,我们可以对四元数之间的乘法进行归纳化简:
q1q2=ae+afi+agj+ahk+bei+bfi2+bgij+bhik+cej+cfji+cgj2+chjk+dek+dfki+dgkj+dhk2=(ae−bf−cg−dh)+(be+af−dg+ch)i+(ce+df+ag−bh)j+(de−cf+bg+ah)k
矩阵形式
可以看到,四元数的相乘其实也是一个线性组合,我们同样可以将它写成矩阵的形式:
q1q2=abcd−bad−c−c−dab−dc−baefgh
注意,这个矩阵所作出的变换等价于左乘 q1。因为四元数不符合乘法交换律,所以右乘 q1的变换是一个不同的矩阵,它可以使用完全相同的方法推导而得,下面这个矩阵所作出的变换等价于右乘 q1
q2q1=abcd−ba−dc−cda−b−d−cbaefgh
Graßmann积
重新整理之前的乘法结果:
q1q2=(ae−(bf+cg+dh))+(be+af+ch−dg)i+(ce+ag+df−bh)j+(de+ah+bg−cf)k
如果令 v=bcd,u=fgh,那么
v⋅u=bf+cg+dh
v×u=ibfjcgkdh=(ch−dg)i−(bh−df)j+(bg−cf)k
注意 v×u 的结果是一个向量,这里的 i、j、k 是向量的基,如果使用标量向量有序对形式来表示,q1q2 的结果可以用向量点乘和叉乘的形式表示出来
q1q2=[ae−v⋅u,au+ev+v×u]
这个结果也被叫做 Graßmann积,一般来说:
Theorem 7:Graßmann积
对任意四元数 q1=[s,v],q2=[t,u],q1q2 的结果是
q1q2=[st−v⋅u,su+tv+v×u]
纯四元数
实部为零,仅有虚部的四元数为纯四元数,即:
q=[0,v]
对于两个纯四元数 q1=[0,v],q2=[0,u],那么它们的乘积为:
q1q2=[−v⋅u,v×u]
共轭
四元数 q=a+bi+cj+dk 的共轭为 q∗=a−bi−cj−dk。如果用标量向量有序对的形式来定义的话,q=[s,v] 的共轭为 q∗=[s,−v]。共轭四元数的一个非常有用的性质就是
qq∗=[s,v]⋅[s,−v]=[s2−v⋅(−v),s(−v)+sv+v×(−v)]=[s2+v⋅v,0]=s2+x2+y2+z2=∥q∥2
结果是一个标量,正是四元数模长的平方。
q∗q=(q∗)(q∗)∗=∥q∗∥2=∥q∥2
我们得到,q∗q=qq∗,这个特殊的乘法遵守交换律。
逆
因为四元数乘法不遵守交换律,我们不会将两个四元数相除写为 qp 的形式,取而代之的是将乘法的逆运算定义为 pq−1 或者 q−1p,注意它们的结果一般是不同的。
其中,q−1 是 q 的逆,我们规定
qq−1=q−1q=1(q=0)
右乘 q 的逆运算为右乘 q−1,左乘 q 的逆运算为左乘 q−1。
利用共轭,我们可以进行如下推导:
qq−1q∗qq−1∥q∥2q−1q−1=1=q∗=q∗=∥q∥2q∗
四元数的逆就是它的共轭除以它模长的平方。如果 ∥q∥=1,那么它的逆就是它的共轭,此时称 q 为一个单位四元数。
四元数与3D旋转
如果我们需要将一个向量 v 沿着一个用单位向量所定义的旋转轴 u 旋转 θ 度,那么我们可以将这个向量 v 拆分为正交于旋转轴的 v⊥ 以及平行于旋转轴的 v∥。我们可以对这两个分向量分别进行旋转,获得 v⊥′ 和 v∥′。将它们相加就是 v 旋转之后的结果 v′=v⊥′+v∥′。
我们可以将这些向量定义为纯四元数:
vv⊥v∥v′v⊥′v∥′u=[0,v]=[0,v⊥]=[0,v∥]=[0,v′]=[0,v⊥′]=[0,v∥′]=[0,u]
那么我们就能得到
v=v∥+v⊥v′=v∥′+v⊥′
和之前一样,我们这里也分开讨论 v⊥ 和 v∥ 的情况。
v⊥ 的旋转
我们在上一篇推导过,如果一个向量 v⊥ 正交于旋转轴 u,那么
v⊥′=cos(θ)v⊥+sin(θ)(u×v⊥)
而且,对于两个纯四元数 q1=[0,v],q2=[0,u],那么它们的乘积为 q1q2=[−v⋅u,v×u],类似地,
uv⊥=[−u⋅v⊥,u×v⊥]
因为 v⊥ 正交于 u,所以 u⋅v⊥=0,也就是说,
uv⊥=[0,u×v⊥]=u×v⊥
将这个等式以及之前定义的纯四元数代入,而且四元数乘法遵守分配律,我们可以获得:
v⊥′=cos(θ)v⊥+sin(θ)(uv⊥)=(cos(θ)+sin(θ)u)v⊥
可以注意到,如果我们将 (cos(θ)+sin(θ)u) 看作是一个四元数,我们就能将旋转写成四元数的乘积了。到此为止,我们已经将旋转与四元数的积联系起来了。如果令 q=cos(θ)+sin(θ)u,我们能得到
v⊥′=qv⊥
我们可以对 q 继续进行变形:
q=cos(θ)+sin(θ)u=[cos(θ),0]+[0,sin(θ)u]=[cos(θ),sin(θ)u]
也就是说,如果旋转轴 u 的坐标为 uxuyuz,旋转角为 θ,那么完成这一旋转所需的四元数 q 可以构造为
q=cos(θ)+sin(θ)uxi+sin(θ)uyj+sin(θ)uzk
这样我们就完成了对 v⊥ 的旋转,我们可以得到下面这个定理:
Theorem 8:3D 旋转公式(四元数型,正交情况)
当 v⊥ 正交于旋转轴 u 时,旋转 θ 角度之后的 v⊥′ 可以使用四元数乘法来获得,令 v⊥=[0,v⊥],q=[cos(θ),sin(θ)u],那么:
v⊥′=qv⊥
这个四元数 q 的模长为 1,它是一个单位四元数,它所代表的变换不会对原向量进行缩放,是一个纯旋转。
∥q∥=cos2(θ)+(sin(θ)u⋅sin(θ)u)=cos2(θ)+sin2(θ)(u⋅u)=cos2(θ)+sin2(θ)(∥u∥2)=cos2(θ)+sin2(θ)=1
v∥ 的旋转
接下来是平行于旋转轴的 v∥,由于它平行于旋转轴,所以旋转不会对它作出任何的变换,也就是说:
Theorem 9:3D 旋转公式(四元数型,平行情况)
当 v∥ 平行于旋转轴 u 时,旋转 θ 角度之后的 v∥′ 可以用四元数写为:
v∥′=v∥
v 的旋转
v′=v∥′+v⊥′=v∥+qv⊥(其中q=[cos(θ),sin(θ)u])
在进一步化简前,我们需要证明几个引理:
Lemma 1
如果 q=[cos(θ),sin(θ)u],而且 u 为单位向量,那么 q2=qq=[cos(2θ),sin(2θ)u]
Proof.
q2=[cos(θ),sin(θ)u]⋅[cos(θ),sin(θ)u]=[cos2(θ)−(sin(θ)u⋅sin(θ)u),(cos(θ)sin(θ)+sin(θ)cos(θ))u+(sin(θ)u×sin(θ)u)]=[cos2(θ)−sin2(θ)∥u∥2,2sin(θ)cos(θ)u+0]=[cos2(θ)−sin2(θ),2sin(θ)cos(θ)u]=[cos(2θ),sin(2θ)u]
这个引理的几何意义是,如果沿着同一个轴 u 连续旋转 θ 度两次,那么所作出的变换等同于直接沿着 u 旋转 2θ 度
那么,我们就能够对原本的旋转公式进行变形了
v′=v∥+qv⊥(q=[cos(θ),sin(θ)u])=1⋅v∥+qv⊥=pp−1v∥+ppv⊥(令q=p2,则p=[cos(21θ),sin(21θ)u])
在这里,我们引入了一个新的四元数 p=[cos(21θ),sin(21θ)u]。根据刚刚证明的引理,我们可以验证
pp=p2=[cos(2⋅21θ),sin(2⋅21θ)u]=[cos(θ),sin(θ)u]=q
和 q 一样,∥p∥=1,p 也是一个单位四元数,也就是说
p−1=p∗
将这个结果代入之前的等式中
v′=pp−1v∥+ppv⊥=pp∗v∥+ppv⊥
我们还需再证明两个引理:
Lemma 2
假设 v∥=[0,v∥] 是一个纯四元数,而 q=[α,βu],其中 u 是一个单位向量,α,β∈R,在这种条件下,如果 v∥ 平行于 u,那么 qv∥=v∥q
Proof.
LHS=qv∥=[α,βu]⋅[0,v∥]=[0−βu⋅v∥,αv∥+0+βu×v∥]=[−βu⋅v∥,αv∥](v∥平行于u,所以βu×v∥=0)
RHS=v∥q=[0,v∥]⋅[α,βu]=[0−v∥⋅βu,0+αv∥+v∥×βu]=[−v∥⋅βu,αv∥](v∥平行于u,所以v∥×βu=0)=[−βu⋅v∥,αv∥]=LHS(点乘遵守交换律)
Lemma 3
假设 v⊥=[0,v⊥] 是一个纯四元数,而 q=[α,βu],其中 u 是一个单位向量,α,β∈R,在这种条件下,如果 v⊥ 正交于 u,那么 qv⊥=v⊥q∗
Proof.
LHS=qv⊥=[α,βu]⋅[0,v⊥]=[0−βu⋅v⊥,αv⊥+0+βu×v⊥]=[0,αv⊥+βu×v⊥](v⊥正交于u,所以βu⋅v⊥=0)
RHS=v⊥q∗=[0,v⊥]⋅[α,−βu]=[0+v⊥⋅βu,0+αv⊥+v⊥×(−βu)]=[0,αv⊥+v⊥×(−βu)](v⊥正交于u,所以v⊥⋅βu=0)=[0,αv⊥−(−βu)×v⊥](a×b=−b×a)=[0,αv⊥+βu×v⊥]=LHS
现在,我们能对之前的公式做出最后的变形了:
v′=pp∗v∥+ppv⊥=pv∥p∗+pv⊥p∗=p(v∥+v⊥)p∗=pvp∗
我们可以将上述推导总结为一个定理:
Theorem 10:3D 旋转公式(四元数型,一般情况)
任意向量 v 沿着以单位向量定义的旋转轴 u 旋转 θ 度之后的 v′ 可以使用四元数乘法来获得。令 v=[0,v],q=[cos(21θ),sin(21θ)u],那么:
v′=qvq∗=qvq−1
如果我们有 q=[cos(θ),sin(θ)u],那么 v′=qvq∗ 可以将 v 沿着 u 旋转 2θ 度。
虽然这个公式非常简洁,但是不够直观,想了解它的真正含义的话,还需将它还原到变形之前的式子:
v′=qvq∗=qq∗v∥+qqv⊥=v∥+q2v⊥
也就是说,qvq∗ 这个变换,对 v 平行于旋转轴的分量 v∥ 实施的变换是 qq∗,这两个变换完全抵消了,也就是没有旋转,而对于正交于旋转轴的分量 v⊥ 则实施的是两次变换 q2=qq,将它旋转 2θ+2θ=θ 度。
实际上,这个公式和上一篇推导的向量型旋转公式完全等价,证明可能会用到 a×(b×c)=(a⋅c)b−(a⋅b)c 这个公式
qvq∗=[0,cos(θ)v+(1−cos(θ))(u⋅v)u+sin(θ)(u×v)]
因为所有的旋转四元数的实部都只是一个角度的余弦值,假设有一个单位四元数 q=[a,b],那么我们可以直接得到
2θ=arccos(a)u=sin(arccos(a))b
3D旋转的矩阵形式
左乘一个四元数 q=a+bi+cj+dk 等同于下面这个矩阵
L(q)=abcd−bad−c−c−dab−dc−ba
而右乘 q 等同于这个矩阵
R(q)=abcd−ba−dc−cda−b−d−cba
所以,我们可以利用这两个公式将 v′=qvq∗ 写成矩阵形式。假设 a=cos(2θ),b=sin(2θ)ux,c=sin(2θ)uy,d=sin(2θ)uz,q=a+bi+cj+dk,我们就能得到:
qvq∗=L(q)R(q∗)v(或者R(q∗)L(q)v,它们是等价的)=abcd−bad−c−c−dab−dc−baa−b−c−dbad−cc−dabdc−bav(注意R(q∗)=R(q)T)=a2+b2+c2+d2ab−ab+cd−cdac−bd−ac+bdad+bc−bc−adab−ab−cd+cdb2+a2−d2−c2bc+ad+ad+bcbd−ac+bd−acac+bd−ac−bdbc−ad−ad+bcc2−d2+a2−b2cd+cd+ab+abad−bc+bc−adbd+ac+bd+accd+cd−ab−abd2−c2−b2+a2v
因为 a2+b2+c2+d2=1,这个式子能化简为
qvq∗=100001−2c2−2d22bc+2ad2bd−2ac02bc−2ad1−2b2−2d22ab+2cd02ac+2bd2cd−2ab1−2b2−2c2v
这样我们就得到了 3D 旋转的矩阵形式。因为矩阵的第一行和第一列不会对 v 进行任何变换,我们可以将它压缩成 3 × 3 矩阵(用作 3D 向量的变换):
Theorem 11:3D 旋转公式(矩阵型)
任意向量 v 沿着以单位向量定义的旋转轴 u 旋转 θ 度之后的 v′ 可以使用矩阵乘法来获得。令 a=cos(2θ),b=sin(2θ)ux,c=sin(2θ)uy,d=sin(2θ)uz,那么:
v′=1−2c2−2d22bc+2ad2bd−2ac2bc−2ad1−2b2−2d22ab+2cd2ac+2bd2cd−2ab1−2b2−2c2v
虽然 3D 旋转的矩阵形式可能不如四元数形式简单,而且占用更多的空间,但是对于大批量的变换,使用预计算好的矩阵是比四元数乘法更有效率的。
旋转的复合
假设有两个表示沿着不同轴,不同角度旋转的四元数 q1,q2,我们先对 v 进行 q1 的变换,再进行 q2 的变换。
首先,我们实施 q1 的变换,变换后的 v′ 为
v′=q1vq1∗
接下来,对 v′ 进行 q2 的变换,得到 v′′
v′′=q2v′q2∗=q2q1vq1∗q2∗
我们需要对这两个变换进行复合,写为一个等价变换的形式:
v′′=qnetvqnet∗
为了写成上面这种形式,我们还需要一个引理:
Lemma 4
对任意四元数 q1=[s,v]、q2=[t,u]
q1∗q2∗=(q2q1)∗
Proof.
LHS=q1∗q2∗=[s,−v]⋅[t,−u]=[st−(−v)⋅(−u),s(−u)+t(−v)+(−v)×(−u)]=[st−v⋅u,−su−tv+v×u]
RHS=(q2q1)∗=([t,u]⋅[s,v])∗=[ts−u⋅v,tv+su+u×v]=[st−v⋅u,−su−tv+v×u]=LHS
所以我们能得到
v′′=q2q1vq1∗q2∗=(q2q1)v(q2q1)∗
这也就是说,qnet=q2q1。注意四元数乘法的顺序,我们先进行的是 q1 的变换,再进行 q2 的变换。这和矩阵与函数的复合非常相似,都是从右往左叠加。
要注意的是,q1 与 q2 的等价旋转 qnet 并不是分别沿着 q1 和 q2 的两个旋转轴进行的两次旋转。它是沿着一个全新的旋转轴进行的一次等价旋转,仅仅只有旋转的结果相同。
虽然我们讨论的是两个旋转的复合,但是它可以很容易地推广到多个旋转的复合。比如说我们还需要进行第三个旋转 q3,那么
v′′′=q3(q2q1)v(q2q1)∗q3∗=(q3q2q1)v(q3q2q1)∗
它的等价旋转就是 qnet=q3q2q1
双倍覆盖
四元数与 3D 旋转的关系并不是一对一的,同一个 3D 旋转可以使用两个不同的四元数来表示。对任意的四元数 q=[cos(2θ),sin(2θ)u],q 与 −q 代表的是同一个旋转。如果 q 表示的是沿着旋转轴 u 旋转 θ 度,那么 −q 代表的是沿着相反的旋转轴 −u 旋转 (2π−θ) 度:
−q=[−cos(2θ),−sin(2θ)u]=[cos(π−2θ),sin(π−2θ)(−u)](cos(π−θ)=−cos(θ),sin(π−θ)=sin(θ))
所以,这个四元数旋转的角度为 2(π−2θ)=2π−θ。从下面的图中我们可以看到,这两个旋转是完全等价的:

其实从四元数的旋转公式中也能推导出相同的结果
(−q)v(−q)∗=(−1)2qvq∗=qvq∗
所以,我们经常说单位四元数与 3D 旋转有一个“2对1满射同态”关系,或者说单位四元数“双倍覆盖”了 3D 旋转。
因为这个映射是满射,我们可以说所有的单位四元数都对应着一个 3D 旋转。或者说,一个四维单位超球面(也叫做 S3)上任意一点所对应的四元数(∥q∥=1)都对应着一个 3D 旋转。
有一点需要注意的是,虽然 q 与 −q 是两个不同的四元数,但是由于旋转矩阵中的每一项都包含了四元数两个分量的乘积,它们的旋转矩阵是完全相同的。旋转矩阵并不会出现双倍覆盖的问题。
指数形式
在讨论复数的时候,我们利用欧拉公式将 2D 的旋转写成了 v′=eiθv 这样的指数形式。实际上,我们也可以利用四元数将 3D 旋转写成类似的形式。
类似于复数的欧拉公式,四元数也有一个类似的公式,如果 u 是一个单位向量,那么对于单位四元数 u=[0,u],有
euθ=cos(θ)+usin(θ)=cos(θ)+usin(θ)
也就是说,q=[cos(θ),sin(θ)u] 可以使用指数表示为 euθ。这个公式的证明与欧拉公式的证明非常类似,直接使用级数展开就可以了。
Proof.
我们知道,ex,sin(x),cos(x) 分别能用泰勒级数展开为:
exsin(x)cos(x)=n=0∑∞n!xn=1+x+2!x2+3!x3+4!x4+…=n=0∑∞(2n+1)!(−1)nx2n+1=x−3!x3+5!x5−7!x7+…=n=0∑∞(2n)!(−1)nx2n=1−2!x2+4!x4−6!x6+…
我们可以将 x=uθ 代入 ex,得到
LHS=euθ=n=0∑∞n!(uθ)n=1+uθ+2!(uθ)2+3!(uθ)3+4!(uθ)4+5!(uθ)5+…=1+uθ+2!u2θ2+3!u3θ3+4!u4θ4+5!u5θ5+…
因为 u2=[−u⋅u,0]=−∥u∥2=−1,我们可以对 euθ 进一步化简
LHS=1+uθ+2!u2θ2+3!uu2θ3+4!(u2)2θ4+5!u(u2)2θ5+…=1+uθ−2!θ2−3!uθ3+4!θ4+5!uθ5−…
同理,将 θ 代入 cos(x) 和 sin(x),
sin(θ)cos(θ)=n=0∑∞(2n+1)!(−1)nθ2n+1=θ−3!θ3+5!θ5−7!θ7+…=n=0∑∞(2n)!(−1)nθ2n=1−2!θ2+4!θ4−6!θ6+…
所以,
RHS=cos(θ)+usin(θ)=n=0∑∞(2n)!(−1)nθ2n+un=0∑∞(2n+1)!(−1)nθ2n+1=1+uθ−2!θ2−3!uθ3+4!θ4+5!uθ5−⋯=LHS
因为 u 是一个单位向量,u2=[−u⋅u,0]=−∥u∥2=−1,这与欧拉公式中的 i 是非常类似的。
有了指数型的表示方式,我们就能够将之前四元数的旋转公式改写为指数形式了:
Theorem 12:3D 旋转公式(指数型)
任意向量 v 沿着以单位向量定义的旋转轴 u 旋转 θ 度之后的 v′ 可以使用四元数的指数表示。令 v=[0,v],u=[0,u],那么:
v′=eu2θve−u2θ
有了四元数的指数定义,我们就能够定义四元数的更多运算了,首先是自然对数 log,对任意单位四元数 q=[cos(θ),sin(θ)u],
log(q)=log(euθ)=[0,uθ]
接下来是四元数的幂运算
qt=(euθ)t=eu(tθ)=[cos(tθ),sin(tθ)u]
可以看到,一个单位四元数的 t 次幂等同于将它的旋转角缩放至 t 倍,并且不会改变它的旋转轴(u 必须是单位向量,所以一般不能与 t 结合)。这些运算会在之后讨论四元数插值时非常有用。