四元数和三维旋转(二)

本文最后更新于:2025年4月17日 晚上

四元数

所有的四元数 qHq \in \mathbb{H} 都可以写成下面这种形式:

q=a+bi+cj+dk,(a,b,c,dR)q = a + bi + cj + dk,(a,b,c,d \in \mathbb{R})

其中

i2=j2=k2=ijk=1i^2 = j^2 = k^2 = ijk = -1

如果把上式称为四元数的代数形式,那么和复数类似,它也有对应的向量形式一

q=[abcd]q = \begin{bmatrix} a\\ b\\ c\\ d\\ \end{bmatrix}

如果将四元数 qq 的实部和虚部分开,并用一个三维的向量来表示虚部,将它表示为标量和向量的有序对形式,那么四元数还可以表示为下述的向量形式二

q=[s,v],(v=[xyz],s,x,y,zR)q = [s, \pmb{v}], (\pmb{v} = \begin{bmatrix} x\\ y\\ z\\ \end{bmatrix},\quad s,x,y,z \in \mathbb{R})

四元数的性质

四元数的模长

仿照复数模长的定义,我们可以暂时将四元数 q=a+bi+cj+dkq = a + bi + cj + dk 的模长定义为

q=a2+b2+c2+d2\lVert q \rVert = \sqrt{a^2 + b^2 + c^2 + d^2}

如果用标量向量有序对的形式进行表示的话,q=[s,v]q = [s, \pmb{v}] 的模长为:

q=s2+v2=s2+vv\lVert q \rVert = \sqrt{s^2 + \lVert\pmb{v}\rVert^2} = \sqrt{s^2 + \pmb{v}\cdot\pmb{v}}

四元数的加减法

与复数类似,四元数的加法只需要将分量相加就可以了,如果我们有两个四元数 q1=a+bi+cj+dkq_{1} = a + bi + cj + dkq2=e+fi+gj+hkq_{2} = 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\begin{aligned} q_{1} + q_{2} &= a + bi + cj + dk + e + fi + gj + hk\\ &= (a + e) + (b + f)i + (c + g)j + (d + h)k \end{aligned}

减法同理,将加号改为减号就可以了

q1q2=(ae)+(bf)i+(cg)j+(dh)kq_{1} - q_{2} = (a - e) + (b - f)i + (c - g)j + (d - h)k

如果四元数是以标量向量有序对形式定义的,比如说 q1=[s,v]q_{1} = [s, \pmb{v}]q2=[t,u]q_{2} = [t, \pmb{u}],那么

q1±q2=[s±t,v±u]q_{1} \pm q_{2} = [s \pm t, \pmb{v}\pm\pmb{u}]

四元数的标量乘法

如果我们有一个四元数 q=a+bi+cj+dkq = a + bi + cj + dk 和一个标量 ss,那么它们的乘积为:

sq=s(a+bi+cj+dk)=sa+sbi+scj+sdk\begin{aligned} sq &= s(a + bi + cj + dk)\\ &= sa + sbi + scj + sdk \end{aligned}

四元数与标量的乘法遵守交换律,也就是说 sq=qssq = qs

四元数乘法

四元数之间的乘法不遵守交换律,也就是说一般情况下 q1q2q2q1q_{1}q_{2} \neq q_{2}q_{1}。这也就有了左乘和右乘的区别,如果是 q1q2q_{1}q_{2},我们就说"q2q_{2} 左乘以 q1q_{1}“,如果是 q2q1q_{2}q_{1},那我们就说"q2q_{2} 右乘以 q1q_{1}”。除了交换律之外,结合律和分配律在四元数内都是成立的。

如果有两个四元数 q1=a+bi+cj+dkq_{1} = a + bi + cj + dkq2=e+fi+gj+hkq_{2} = 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\begin{aligned} q_{1}q_{2} &= (a + bi + cj + dk)(e + fi + gj + hk)\\ &= ae + afi + agj + ahk +\\ &\quad bei + bfi^2 + bgij + bhik +\\ &\quad cej + cfji + cgj^2 + chjk +\\ &\quad dek + dfki + dgkj + dhk^2 \end{aligned}

i2=j2=k2=ijk=1i^2 = j^2 = k^2 = ijk = -1 我们可以推导出 jk=ijk = iij=kij = kki=jki = jkj=ikj = -iji=kji = -kik=jik = -j,于是我们可以得到:

容易观察到交换律并不成立。利用上面的表格,我们可以对四元数之间的乘法进行归纳化简:

q1q2=ae+afi+agj+ahk+bei+bfi2+bgij+bhik+cej+cfji+cgj2+chjk+dek+dfki+dgkj+dhk2=(aebfcgdh)+(be+afdg+ch)i+(ce+df+agbh)j+(decf+bg+ah)k\begin{aligned} q_{1}q_{2} &= ae + afi + agj + ahk +\\ &\quad bei + bfi^2 + bgij + bhik +\\ &\quad cej + cfji + cgj^2 + chjk +\\ &\quad dek + dfki + dgkj + dhk^2\\ &= (a\textcolor{red}{e} - b\textcolor{blue}{f} - c\textcolor{green}{g} - d\textcolor{orange}{h})+\\ &\quad (b\textcolor{red}{e} + a\textcolor{blue}{f} - d\textcolor{green}{g} + c\textcolor{orange}{h})i+\\ &\quad (c\textcolor{red}{e} + d\textcolor{blue}{f} + a\textcolor{green}{g} - b\textcolor{orange}{h})j+\\ &\quad (d\textcolor{red}{e} - c\textcolor{blue}{f} + b\textcolor{green}{g} + a\textcolor{orange}{h})k\\ \end{aligned}

矩阵形式

可以看到,四元数的相乘其实也是一个线性组合,我们同样可以将它写成矩阵的形式:

q1q2=[abcdbadccdabdcba][efgh]q_{1}q_{2} = \begin{bmatrix} a&-b&-c&-d\\ b&a&-d&c\\ c&d&a&-b\\ d&-c&b&a\\ \end{bmatrix} \begin{bmatrix} \textcolor{red}{e}\\ \textcolor{blue}{f}\\ \textcolor{green}{g}\\ \textcolor{orange}{h}\\ \end{bmatrix}

注意,这个矩阵所作出的变换等价于左乘 q1q_{1}。因为四元数不符合乘法交换律,所以右乘 q1q_{1}的变换是一个不同的矩阵,它可以使用完全相同的方法推导而得,下面这个矩阵所作出的变换等价于右乘 q1q_{1}

q2q1=[abcdbadccdabdcba][efgh]q_{2}q_{1} = \begin{bmatrix} a&-b&-c&-d\\ b&a&d&-c\\ c&-d&a&b\\ d&c&-b&a\\ \end{bmatrix} \begin{bmatrix} \textcolor{red}{e}\\ \textcolor{blue}{f}\\ \textcolor{green}{g}\\ \textcolor{orange}{h}\\ \end{bmatrix}

Graßmann积

重新整理之前的乘法结果:

q1q2=(ae(bf+cg+dh))+(be+af+chdg)i+(ce+ag+dfbh)j+(de+ah+bgcf)k\begin{aligned} q_{1}q_{2} &= (ae -(bf + cg + dh))+\\ &\quad(b\textcolor{red}{e} + \textcolor{blue}{a}f + ch - dg)i+\\ &\quad(c\textcolor{red}{e} + \textcolor{blue}{a}g + df - bh)j+\\ &\quad(d\textcolor{red}{e} + \textcolor{blue}{a}h + bg - cf)k\\ \end{aligned}

如果令 v=[bcd]\pmb{v} = \begin{bmatrix}b\\ c\\ d\\ \end{bmatrix}u=[fgh]\pmb{u} = \begin{bmatrix}f\\ g\\ h\\ \end{bmatrix},那么

vu=bf+cg+dh\pmb{v}\cdot\pmb{u} = bf + cg + dh

v×u=ijkbcdfgh=(chdg)i(bhdf)j+(bgcf)k\begin{aligned} \pmb{v}\times\pmb{u} &= \begin{vmatrix} \pmb{i}&\pmb{j}&\pmb{k}\\ b&c&d\\ f&g&h\\ \end{vmatrix}\\ &= (ch - dg)\pmb{i} - (bh - df)\pmb{j} + (bg - cf)\pmb{k} \end{aligned}

注意 v×u\pmb{v}\times\pmb{u} 的结果是一个向量,这里的 ijk\pmb{i}、\pmb{j}、\pmb{k} 是向量的基,如果使用标量向量有序对形式来表示,q1q2q_{1}q_{2} 的结果可以用向量点乘和叉乘的形式表示出来

q1q2=[aevu,au+ev+v×u]q_{1}q_{2} = [ae - \pmb{v}\cdot\pmb{u}, a\pmb{u} + e\pmb{v} + \pmb{v}\times\pmb{u}]

这个结果也被叫做 Graßmann积,一般来说:

Theorem 7:Graßmann积
对任意四元数 q1=[s,v]q_{1} = [s, \pmb{v}]q2=[t,u]q_{2} = [t, \pmb{u}]q1q2q_{1}q_{2} 的结果是

q1q2=[stvu,su+tv+v×u]q_{1}q_{2} = [st - \pmb{v}\cdot\pmb{u}, s\pmb{u} + t\pmb{v} + \pmb{v}\times\pmb{u}]

纯四元数

实部为零,仅有虚部的四元数为纯四元数,即:

q=[0,v]q = [0, \pmb{v}]

对于两个纯四元数 q1=[0,v]q_{1} = [0, \pmb{v}]q2=[0,u]q_{2} = [0, \pmb{u}],那么它们的乘积为:

q1q2=[vu,v×u]q_{1}q_{2} = [-\pmb{v}\cdot\pmb{u}, \pmb{v}\times\pmb{u}]

共轭

四元数 q=a+bi+cj+dkq = a + bi + cj + dk共轭q=abicjdkq^* = a - bi - cj - dk。如果用标量向量有序对的形式来定义的话,q=[s,v]q = [s, \pmb{v}] 的共轭为 q=[s,v]q^* = [s, -\pmb{v}]。共轭四元数的一个非常有用的性质就是

qq=[s,v][s,v]=[s2v(v),s(v)+sv+v×(v)]=[s2+vv,0]=s2+x2+y2+z2=q2\begin{aligned} qq^* &= [s, \pmb{v}]\cdot[s, -\pmb{v}]\\ &= [s^2 - \pmb{v}\cdot(-\pmb{v}), s(-\pmb{v}) + s\pmb{v} + \pmb{v}\times(-\pmb{v})]\\ &= [s^2 + \pmb{v}\cdot\pmb{v}, 0]\\ &= s^2 + x^2 + y^2 + z^2\\ &= \lVert q \rVert^2 \end{aligned}

结果是一个标量,正是四元数模长的平方。

qq=(q)(q)=q2=q2q^*q = (q^*)(q^*)^* = \lVert q^* \rVert^2 = \lVert q \rVert^2

我们得到,qq=qqq^*q = qq^*,这个特殊的乘法遵守交换律。

因为四元数乘法不遵守交换律,我们不会将两个四元数相除写为 pq\frac{p}{q} 的形式,取而代之的是将乘法的逆运算定义为 pq1pq^{-1} 或者 q1pq^{-1}p,注意它们的结果一般是不同的。

其中,q1q^{-1}qq,我们规定

qq1=q1q=1(q0)qq^{-1} = q^{-1}q = 1\quad(q \neq 0)

右乘 qq 的逆运算为右乘 q1q^{-1},左乘 qq 的逆运算为左乘 q1q^{-1}

利用共轭,我们可以进行如下推导:

qq1=1qqq1=qq2q1=qq1=qq2\begin{aligned} qq^{-1} &= 1\\ q^*qq^{-1} &= q^*\\ \lVert q \rVert^2q^{-1} &= q^*\\ q^{-1} &= \frac{q^*}{\lVert q \rVert^2}\\ \end{aligned}

四元数的逆就是它的共轭除以它模长的平方。如果 q=1\lVert q \rVert = 1,那么它的逆就是它的共轭,此时称 qq 为一个单位四元数

四元数与3D旋转

如果我们需要将一个向量 v\pmb{v} 沿着一个用单位向量所定义的旋转轴 u\pmb{u} 旋转 θ\theta 度,那么我们可以将这个向量 v\pmb{v} 拆分为正交于旋转轴的 v\pmb{v_{\perp}} 以及平行于旋转轴的 v\pmb{v_{\parallel}}。我们可以对这两个分向量分别进行旋转,获得 v\pmb{v_{\perp}'}v\pmb{v_{\parallel}'}。将它们相加就是 v\pmb{v} 旋转之后的结果 v=v+v\pmb{v'} = \pmb{v_{\perp}'} + \pmb{v_{\parallel}'}

我们可以将这些向量定义为纯四元数:

v=[0,v]v=[0,v]v=[0,v]v=[0,v]v=[0,v]v=[0,v]u=[0,u]\begin{aligned} v &= [0, \pmb{v}]\\ v_{\perp} &= [0, \pmb{v_{\perp}}]\\ v_{\parallel} &= [0, \pmb{v_{\parallel}}]\\ v' &= [0, \pmb{v'}]\\ v_{\perp}' &= [0, \pmb{v_{\perp}'}]\\ v_{\parallel}' &= [0, \pmb{v_{\parallel}'}]\\ u &= [0, \pmb{u}] \end{aligned}

那么我们就能得到

v=v+vv=v+vv = v_{\parallel} + v_{\perp} \qquad v' = v_{\parallel}' + v_{\perp}'

和之前一样,我们这里也分开讨论 vv_{\perp}vv_{\parallel} 的情况。

vv_{\perp} 的旋转

我们在上一篇推导过,如果一个向量 v\pmb{v_{\perp}} 正交于旋转轴 u\pmb{u},那么

v=cos(θ)v+sin(θ)(u×v)\pmb{v_{\perp}'} = \cos(\theta)\pmb{v_{\perp}} + \sin(\theta)(\pmb{u}\times\pmb{v_{\perp}})

而且,对于两个纯四元数 q1=[0,v]q_{1} = [0, \pmb{v}]q2=[0,u]q_{2} = [0, \pmb{u}],那么它们的乘积为 q1q2=[vu,v×u]q_{1}q_{2} = [-\pmb{v}\cdot\pmb{u}, \pmb{v}\times\pmb{u}],类似地,

uv=[uv,u×v]uv_{\perp} = [-\pmb{u}\cdot\pmb{v_{\perp}}, \pmb{u}\times\pmb{v_{\perp}}]

因为 v\pmb{v_{\perp}} 正交于 u\pmb{u},所以 uv=0\pmb{u}\cdot\pmb{v_{\perp}} = 0,也就是说,

uv=[0,u×v]=u×v\begin{aligned} uv_{\perp} &= [0, \pmb{u}\times\pmb{v_{\perp}}]\\ &= \pmb{u}\times\pmb{v_{\perp}} \end{aligned}

将这个等式以及之前定义的纯四元数代入,而且四元数乘法遵守分配律,我们可以获得:

v=cos(θ)v+sin(θ)(uv)=(cos(θ)+sin(θ)u)v\begin{aligned} v_{\perp}' &= \cos(\theta)v_{\perp} + \sin(\theta)(uv_{\perp})\\ &= (\cos(\theta) + \sin(\theta)u)v_{\perp} \end{aligned}

可以注意到,如果我们将 (cos(θ)+sin(θ)u)(\cos(\theta) + \sin(\theta)u) 看作是一个四元数,我们就能将旋转写成四元数的乘积了。到此为止,我们已经将旋转与四元数的积联系起来了。如果令 q=cos(θ)+sin(θ)uq = \cos(\theta) + \sin(\theta)u,我们能得到

v=qvv_{\perp}' = qv_{\perp}

我们可以对 qq 继续进行变形:

q=cos(θ)+sin(θ)u=[cos(θ),0]+[0,sin(θ)u]=[cos(θ),sin(θ)u]\begin{aligned} q &= \cos(\theta) + \sin(\theta)u\\ &= [\cos(\theta), \pmb{0}] + [0, \sin(\theta)\pmb{u}]\\ &= [\cos(\theta), \sin(\theta)\pmb{u}]\\ \end{aligned}

也就是说,如果旋转轴 u\pmb{u} 的坐标为 [uxuyuz]\begin{bmatrix}u_{x}\\ u_{y}\\ u_{z}\end{bmatrix},旋转角为 θ\theta,那么完成这一旋转所需的四元数 qq 可以构造为

q=cos(θ)+sin(θ)uxi+sin(θ)uyj+sin(θ)uzkq = \cos(\theta) + \sin(\theta)u_{x}i + \sin(\theta)u_{y}j + \sin(\theta)u_{z}k

这样我们就完成了对 vv_{\perp} 的旋转,我们可以得到下面这个定理:

Theorem 8:3D 旋转公式(四元数型,正交情况)
v\pmb{v_{\perp}} 正交于旋转轴 u\pmb{u} 时,旋转 θ\theta 角度之后的 v\pmb{v_{\perp}'} 可以使用四元数乘法来获得,令 v=[0,v]v_{\perp} = [0, \pmb{v_{\perp}}]q=[cos(θ),sin(θ)u]q = [\cos(\theta), \sin(\theta)\pmb{u}],那么:

v=qvv_{\perp}' = qv_{\perp}

这个四元数 qq 的模长为 1,它是一个单位四元数,它所代表的变换不会对原向量进行缩放,是一个纯旋转。

q=cos2(θ)+(sin(θ)usin(θ)u)=cos2(θ)+sin2(θ)(uu)=cos2(θ)+sin2(θ)(u2)=cos2(θ)+sin2(θ)=1\begin{aligned} \lVert q \rVert &= \sqrt{\cos^2(\theta) + (\sin(\theta)\pmb{u}\cdot\sin(\theta)\pmb{u})}\\ &= \sqrt{\cos^2(\theta) + \sin^2(\theta)(\pmb{u}\cdot\pmb{u})}\\ &= \sqrt{\cos^2(\theta) + \sin^2(\theta)(\lVert\pmb{u}\rVert^2)}\\ &= \sqrt{\cos^2(\theta) + \sin^2(\theta)}\\ &= 1 \end{aligned}

vv_{\parallel} 的旋转

接下来是平行于旋转轴的 vv_{\parallel},由于它平行于旋转轴,所以旋转不会对它作出任何的变换,也就是说:

Theorem 9:3D 旋转公式(四元数型,平行情况)
v\pmb{v_{\parallel}} 平行于旋转轴 u\pmb{u} 时,旋转 θ\theta 角度之后的 v\pmb{v_{\parallel}'} 可以用四元数写为:

v=vv_{\parallel}' = v_{\parallel}

vv 的旋转

v=v+v=v+qv(其中q=[cos(θ),sin(θ)u])\begin{aligned} v' &= v_{\parallel}' + v_{\perp}'\\ &= v_{\parallel} + qv_{\perp} \qquad (其中 q = [\cos(\theta), \sin(\theta)\pmb{u}]) \end{aligned}

在进一步化简前,我们需要证明几个引理:

Lemma 1
如果 q=[cos(θ),sin(θ)u]q = [\cos(\theta), \sin(\theta)\pmb{u}],而且 u\pmb{u} 为单位向量,那么 q2=qq=[cos(2θ),sin(2θ)u]q^2 = qq = [\cos(2\theta), \sin(2\theta)\pmb{u}]

ProofProof.

q2=[cos(θ),sin(θ)u][cos(θ),sin(θ)u]=[cos2(θ)(sin(θ)usin(θ)u),(cos(θ)sin(θ)+sin(θ)cos(θ))u+(sin(θ)u×sin(θ)u)]=[cos2(θ)sin2(θ)u2,2sin(θ)cos(θ)u+0]=[cos2(θ)sin2(θ),2sin(θ)cos(θ)u]=[cos(2θ),sin(2θ)u]\begin{aligned} q^2 &= [\cos(\theta), \sin(\theta)\pmb{u}] \cdot [\cos(\theta), \sin(\theta)\pmb{u}]\\ &= [\cos^2(\theta) - (\sin(\theta)\pmb{u}\cdot\sin(\theta)\pmb{u}), (\cos(\theta)\sin(\theta) + \sin(\theta)\cos(\theta))\pmb{u} + (\sin(\theta)\pmb{u}\times\sin(\theta)\pmb{u})]\\ &= [\cos^2(\theta) - \sin^2(\theta)\lVert\pmb{u}\rVert^2, 2\sin(\theta)\cos(\theta)\pmb{u} + \pmb{0}]\\ &= [\cos^2(\theta) - \sin^2(\theta), 2\sin(\theta)\cos(\theta)\pmb{u}]\\ &= [\cos(2\theta), \sin(2\theta)\pmb{u}] \end{aligned}

这个引理的几何意义是,如果沿着同一个轴 u\pmb{u} 连续旋转 θ\theta 度两次,那么所作出的变换等同于直接沿着 u\pmb{u} 旋转 2θ2\theta

那么,我们就能够对原本的旋转公式进行变形了

v=v+qv(q=[cos(θ),sin(θ)u])=1v+qv=pp1v+ppv(q=p2,则p=[cos(12θ),sin(12θ)u])\begin{aligned} v' &= v_{\parallel} + qv_{\perp} \qquad\qquad (q = [\cos(\theta), \sin(\theta)\pmb{u}])\\ &= 1 \cdot v_{\parallel} + qv_{\perp}\\ &= pp^{-1}v_{\parallel} + ppv_{\perp} \quad (令 q = p^2,则 p = [\cos(\frac{1}{2}\theta), \sin(\frac{1}{2}\theta)\pmb{u}]) \end{aligned}

在这里,我们引入了一个新的四元数 p=[cos(12θ),sin(12θ)u]p = [\cos(\frac{1}{2}\theta), \sin(\frac{1}{2}\theta)\pmb{u}]。根据刚刚证明的引理,我们可以验证

pp=p2=[cos(212θ),sin(212θ)u]=[cos(θ),sin(θ)u]=q\begin{aligned} pp &= p^2\\ &= [\cos(2\cdot\frac{1}{2}\theta), \sin(2\cdot\frac{1}{2}\theta)\pmb{u}]\\ &= [\cos(\theta), \sin(\theta)\pmb{u}] = q \end{aligned}

qq 一样,p=1\lVert p \rVert = 1pp 也是一个单位四元数,也就是说

p1=pp^{-1} = p^*

将这个结果代入之前的等式中

v=pp1v+ppv=ppv+ppv\begin{aligned} v' &= pp^{-1}v_{\parallel} + ppv_{\perp}\\ &= pp^*v_{\parallel} + ppv_{\perp} \end{aligned}

我们还需再证明两个引理:

Lemma 2
假设 v=[0,v]v_{\parallel} = [0, \pmb{v_{\parallel}}] 是一个纯四元数,而 q=[α,βu]q = [\alpha, \beta\pmb{u}],其中 u\pmb{u} 是一个单位向量,αβR\alpha,\beta \in \mathbb{R},在这种条件下,如果 v\pmb{v_{\parallel}} 平行于 u\pmb{u},那么 qv=vqqv_{\parallel} = v_{\parallel}q

ProofProof.

LHS=qv=[α,βu][0,v]=[0βuv,αv+0+βu×v]=[βuv,αv](v平行于u,所以βu×v=0)\begin{aligned} LHS &= qv_{\parallel}\\ &= [\alpha, \beta\pmb{u}]\cdot[0, \pmb{v_{\parallel}}]\\ &= [0 - \beta\pmb{u}\cdot\pmb{v_{\parallel}}, \alpha\pmb{v_{\parallel}} + \pmb{0} + \beta\pmb{u}\times\pmb{v_{\parallel}}]\\ &= [-\beta\pmb{u}\cdot\pmb{v_{\parallel}}, \alpha\pmb{v_{\parallel}}] \qquad (\pmb{v_{\parallel}} 平行于 \pmb{u},所以 \beta\pmb{u}\times\pmb{v_{\parallel}} = \pmb{0}) \end{aligned}

RHS=vq=[0,v][α,βu]=[0vβu,0+αv+v×βu]=[vβu,αv](v平行于u,所以v×βu=0)=[βuv,αv]=LHS(点乘遵守交换律)\begin{aligned} RHS &= v_{\parallel}q\\ &= [0, \pmb{v_{\parallel}}]\cdot[\alpha, \beta\pmb{u}]\\ &= [0 - \pmb{v_{\parallel}}\cdot\beta\pmb{u}, \pmb{0} + \alpha\pmb{v_{\parallel}} + \pmb{v_{\parallel}}\times\beta\pmb{u}]\\ &= [-\pmb{v_{\parallel}}\cdot\beta\pmb{u}, \alpha\pmb{v_{\parallel}}] \qquad ({v_{\parallel}} 平行于 \pmb{u},所以 \pmb{v_{\parallel}}\times\beta\pmb{u} = \pmb{0})\\ &= [-\beta\pmb{u}\cdot\pmb{v_{\parallel}}, \alpha\pmb{v_{\parallel}}] = LHS \qquad (点乘遵守交换律) \end{aligned}

Lemma 3
假设 v=[0,v]v_{\perp} = [0, \pmb{v_{\perp}}] 是一个纯四元数,而 q=[α,βu]q = [\alpha, \beta\pmb{u}],其中 u\pmb{u} 是一个单位向量,αβR\alpha,\beta \in \mathbb{R},在这种条件下,如果 v\pmb{v_{\perp}} 正交于 u\pmb{u},那么 qv=vqqv_{\perp} = v_{\perp}q^*

ProofProof.

LHS=qv=[α,βu][0,v]=[0βuv,αv+0+βu×v]=[0,αv+βu×v](v正交于u,所以βuv=0)\begin{aligned} LHS &= qv_{\perp}\\ &= [\alpha, \beta\pmb{u}]\cdot[0, \pmb{v_{\perp}}]\\ &= [0 - \beta\pmb{u}\cdot\pmb{v_{\perp}}, \alpha\pmb{v_{\perp}} + \pmb{0} + \beta\pmb{u}\times\pmb{v_{\perp}}]\\ &= [0, \alpha\pmb{v_{\perp}} + \beta\pmb{u}\times\pmb{v_{\perp}}] \qquad (\pmb{v_{\perp}} 正交于 \pmb{u},所以 \beta\pmb{u}\cdot\pmb{v_{\perp}} = 0) \end{aligned}

RHS=vq=[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\begin{aligned} RHS &= v_{\perp}q^*\\ &= [0, \pmb{v_{\perp}}]\cdot[\alpha, -\beta\pmb{u}]\\ &= [0 + \pmb{v_{\perp}}\cdot\beta\pmb{u}, \pmb{0} + \alpha\pmb{v_{\perp}} + \pmb{v_{\perp}}\times(-\beta\pmb{u})]\\ &= [0, \alpha\pmb{v_{\perp}} + \pmb{v_{\perp}}\times(-\beta\pmb{u})] \qquad ({v_{\perp}} 正交于 \pmb{u},所以 \pmb{v_{\perp}}\cdot\beta\pmb{u} = 0)\\ &= [0, \alpha\pmb{v_{\perp}} - (-\beta\pmb{u})\times\pmb{v_{\perp}}] \qquad (\pmb{a}\times\pmb{b} = -\pmb{b}\times\pmb{a})\\ &= [0, \alpha\pmb{v_{\perp}} + \beta\pmb{u}\times\pmb{v_{\perp}}] = LHS \end{aligned}

现在,我们能对之前的公式做出最后的变形了:

v=ppv+ppv=pvp+pvp=p(v+v)p=pvp\begin{aligned} v' &= pp^*v_{\parallel} + ppv_{\perp}\\ &= pv_{\parallel}p^* + pv_{\perp}p^*\\ &= p(v_{\parallel} + v_{\perp})p^*\\ &= pvp^* \end{aligned}

我们可以将上述推导总结为一个定理:

Theorem 10:3D 旋转公式(四元数型,一般情况)
任意向量 v\pmb{v} 沿着以单位向量定义的旋转轴 u\pmb{u} 旋转 θ\theta 度之后的 v\pmb{v'} 可以使用四元数乘法来获得。令 v=[0,v]v = [0, \pmb{v}]q=[cos(12θ),sin(12θ)u]q = [\cos(\frac{1}{2}\theta), \sin(\frac{1}{2}\theta)\pmb{u}],那么:

v=qvq=qvq1v' = qvq^* = qvq^{-1}

如果我们有 q=[cos(θ),sin(θ)u]q = [\cos(\theta), \sin(\theta)\pmb{u}],那么 v=qvqv' = qvq^* 可以将 v\pmb{v} 沿着 u\pmb{u} 旋转 2θ2\theta 度。

虽然这个公式非常简洁,但是不够直观,想了解它的真正含义的话,还需将它还原到变形之前的式子:

v=qvq=qqv+qqv=v+q2vv' = qvq^* = qq^*v_{\parallel} + qqv_{\perp} = v_{\parallel} + q^2v_{\perp}

也就是说,qvqqvq^* 这个变换,对 vv 平行于旋转轴的分量 vv_{\parallel} 实施的变换是 qqqq^*,这两个变换完全抵消了,也就是没有旋转,而对于正交于旋转轴的分量 vv_{\perp} 则实施的是两次变换 q2=qqq^2 = qq,将它旋转 θ2+θ2=θ\frac{\theta}{2} + \frac{\theta}{2} = \theta 度。

实际上,这个公式和上一篇推导的向量型旋转公式完全等价,证明可能会用到 a×(b×c)=(ac)b(ab)c\pmb{a}\times(\pmb{b}\times\pmb{c}) = (\pmb{a}\cdot\pmb{c})\pmb{b} - (\pmb{a}\cdot\pmb{b})\pmb{c} 这个公式

qvq=[0,cos(θ)v+(1cos(θ))(uv)u+sin(θ)(u×v)]qvq^* = [0, \cos(\theta)\pmb{v} + (1 - \cos(\theta))(\pmb{u}\cdot\pmb{v})\pmb{u} + \sin(\theta)(\pmb{u}\times\pmb{v})]

因为所有的旋转四元数的实部都只是一个角度的余弦值,假设有一个单位四元数 q=[a,b]q = [a, \pmb{b}],那么我们可以直接得到

θ2=arccos(a)u=bsin(arccos(a))\frac{\theta}{2} = \arccos(a) \qquad \pmb{u} = \frac{\pmb{b}}{\sin(\arccos(a))}

3D旋转的矩阵形式

左乘一个四元数 q=a+bi+cj+dkq = a + bi + cj + dk 等同于下面这个矩阵

L(q)=[abcdbadccdabdcba]L(q) = \begin{bmatrix} a&-b&-c&-d\\ b&a&-d&c\\ c&d&a&-b\\ d&-c&b&a\\ \end{bmatrix}

而右乘 qq 等同于这个矩阵

R(q)=[abcdbadccdabdcba]R(q) = \begin{bmatrix} a&-b&-c&-d\\ b&a&d&-c\\ c&-d&a&b\\ d&c&-b&a\\ \end{bmatrix}

所以,我们可以利用这两个公式将 v=qvqv' = qvq^* 写成矩阵形式。假设 a=cos(θ2)b=sin(θ2)uxc=sin(θ2)uyd=sin(θ2)uzq=a+bi+cj+dka = \cos(\frac{\theta}{2}),b = \sin(\frac{\theta}{2})u_{x},c = \sin(\frac{\theta}{2})u_{y},d = \sin(\frac{\theta}{2})u_{z},q = a + bi + cj + dk,我们就能得到:

qvq=L(q)R(q)v(或者R(q)L(q)v,它们是等价的)=[abcdbadccdabdcba][abcdbadccdabdcba]v(注意R(q)=R(q)T)=[a2+b2+c2+d2ababcd+cdac+bdacbdadbc+bcadabab+cdcdb2+a2d2c2bcadad+bcbd+ac+bd+acacbdac+bdbc+ad+ad+bcc2d2+a2b2cd+cdababad+bcbcadbdac+bdaccd+cd+ab+abd2c2b2+a2]v\begin{aligned} qvq^* &= L(q)R(q^*)v \qquad (或者 R(q^*)L(q)v,它们是等价的)\\ &= \begin{bmatrix} a&-b&-c&-d\\ b&a&-d&c\\ c&d&a&-b\\ d&-c&b&a\\ \end{bmatrix} \begin{bmatrix} a&b&c&d\\ -b&a&-d&c\\ -c&d&a&-b\\ -d&-c&b&a\\ \end{bmatrix}v \qquad (注意 R(q^*) = R(q)^T)\\ &= \begin{bmatrix} a^2 + b^2 + c^2 + d^2&ab - ab - cd + cd&ac + bd - ac - bd&ad - bc + bc - ad\\ ab - ab + cd - cd&b^2 + a^2 - d^2 - c^2&bc - ad - ad + bc&bd + ac + bd + ac\\ ac - bd - ac + bd&bc + ad + ad + bc&c^2 - d^2 + a^2 - b^2&cd + cd - ab - ab\\ ad + bc - bc - ad&bd - ac + bd - ac&cd + cd + ab + ab&d^2 - c^2 - b^2 + a^2\\ \end{bmatrix}v \end{aligned}

因为 a2+b2+c2+d2=1a^2 + b^2 + c^2 + d^2 = 1,这个式子能化简为

qvq=[1000012c22d22bc2ad2ac+2bd02bc+2ad12b22d22cd2ab02bd2ac2ab+2cd12b22c2]vqvq^* = \begin{bmatrix} 1&0&0&0\\ 0&1 - 2c^2 - 2d^2&2bc - 2ad&2ac + 2bd\\ 0&2bc + 2ad&1 - 2b^2 - 2d^2&2cd - 2ab\\ 0&2bd - 2ac&2ab + 2cd&1 - 2b^2 - 2c^2\\ \end{bmatrix}v

这样我们就得到了 3D 旋转的矩阵形式。因为矩阵的第一行和第一列不会对 vv 进行任何变换,我们可以将它压缩成 3 ×\times 3 矩阵(用作 3D 向量的变换):

Theorem 11:3D 旋转公式(矩阵型)
任意向量 v\pmb{v} 沿着以单位向量定义的旋转轴 u\pmb{u} 旋转 θ\theta 度之后的 v\pmb{v'} 可以使用矩阵乘法来获得。令 a=cos(θ2)b=sin(θ2)uxc=sin(θ2)uyd=sin(θ2)uza = \cos(\frac{\theta}{2}),b = \sin(\frac{\theta}{2})u_{x},c = \sin(\frac{\theta}{2})u_{y},d = \sin(\frac{\theta}{2})u_{z},那么:

v=[12c22d22bc2ad2ac+2bd2bc+2ad12b22d22cd2ab2bd2ac2ab+2cd12b22c2]vv' = \begin{bmatrix}1 - 2c^2 - 2d^2&2bc - 2ad&2ac + 2bd\\2bc + 2ad&1 - 2b^2 - 2d^2&2cd - 2ab\\2bd - 2ac&2ab + 2cd&1 - 2b^2 - 2c^2\\\end{bmatrix}v

虽然 3D 旋转的矩阵形式可能不如四元数形式简单,而且占用更多的空间,但是对于大批量的变换,使用预计算好的矩阵是比四元数乘法更有效率的。

旋转的复合

假设有两个表示沿着不同轴,不同角度旋转的四元数 q1q_{1}q2q_{2},我们先对 vv 进行 q1q_{1} 的变换,再进行 q2q_{2} 的变换。

首先,我们实施 q1q_{1} 的变换,变换后的 vv'

v=q1vq1v' = q_{1}vq_{1}^*

接下来,对 vv' 进行 q2q_{2} 的变换,得到 vv''

v=q2vq2=q2q1vq1q2\begin{aligned} v'' &= q_{2}v'q_{2}^*\\ &= q_{2}q_{1}vq_{1}^*q_{2}^* \end{aligned}

我们需要对这两个变换进行复合,写为一个等价变换的形式:

v=qnetvqnetv'' = q_{net}vq_{net}^*

为了写成上面这种形式,我们还需要一个引理:

Lemma 4
对任意四元数 q1=[s,v]q2=[t,u]q_{1} = [s, \pmb{v}]、q_{2} = [t, \pmb{u}]

q1q2=(q2q1)q_{1}^*q_{2}^* = (q_{2}q_{1})^*

ProofProof.

LHS=q1q2=[s,v][t,u]=[st(v)(u),s(u)+t(v)+(v)×(u)]=[stvu,sutv+v×u]\begin{aligned} LHS &= q_{1}^*q_{2}^*\\ &= [s, -\pmb{v}]\cdot[t, -\pmb{u}]\\ &= [st - (-\pmb{v})\cdot(-\pmb{u}), s(-\pmb{u}) + t(-\pmb{v}) + (-\pmb{v})\times(-\pmb{u})]\\ &= [st - \pmb{v}\cdot\pmb{u}, -s\pmb{u} - t\pmb{v} + \pmb{v}\times\pmb{u}] \end{aligned}

RHS=(q2q1)=([t,u][s,v])=[tsuv,tv+su+u×v]=[stvu,sutv+v×u]=LHS\begin{aligned} RHS &= (q_{2}q_{1})^*\\ &= ([t, \pmb{u}]\cdot[s, \pmb{v}])^*\\ &= [ts - \pmb{u}\cdot\pmb{v}, t\pmb{v} + s\pmb{u} + \pmb{u}\times\pmb{v}]\\ &= [st - \pmb{v}\cdot\pmb{u}, -s\pmb{u} - t\pmb{v} + \pmb{v}\times\pmb{u}] = LHS \end{aligned}

所以我们能得到

v=q2q1vq1q2=(q2q1)v(q2q1)\begin{aligned} v'' &= q_{2}q_{1}vq_{1}^*q_{2}^*\\ &= (q_{2}q_{1})v(q_{2}q_{1})^*\\ \end{aligned}

这也就是说,qnet=q2q1q_{net} = q_{2}q_{1}。注意四元数乘法的顺序,我们先进行的是 q1q_{1} 的变换,再进行 q2q_{2} 的变换。这和矩阵与函数的复合非常相似,都是从右往左叠加。

要注意的是,q1q_{1}q2q_{2} 的等价旋转 qnetq_{net} 并不是分别沿着 q1q_{1}q2q_{2} 的两个旋转轴进行的两次旋转。它是沿着一个全新的旋转轴进行的一次等价旋转,仅仅只有旋转的结果相同。

虽然我们讨论的是两个旋转的复合,但是它可以很容易地推广到多个旋转的复合。比如说我们还需要进行第三个旋转 q3q_{3},那么

v=q3(q2q1)v(q2q1)q3=(q3q2q1)v(q3q2q1)\begin{aligned} v''' &= q_{3}(q_{2}q_{1})v(q_{2}q_{1})^*q_{3}^*\\ &= (q_{3}q_{2}q_{1})v(q_{3}q_{2}q_{1})^* \end{aligned}

它的等价旋转就是 qnet=q3q2q1q_{net} = q_{3}q_{2}q_{1}

双倍覆盖

四元数与 3D 旋转的关系并不是一对一的,同一个 3D 旋转可以使用两个不同的四元数来表示。对任意的四元数 q=[cos(θ2),sin(θ2)u]q = [\cos(\frac{\theta}{2}), \sin(\frac{\theta}{2})\pmb{u}]qqq-q 代表的是同一个旋转。如果 qq 表示的是沿着旋转轴 u\pmb{u} 旋转 θ\theta 度,那么 q-q 代表的是沿着相反的旋转轴 u-\pmb{u} 旋转 (2πθ)(2\pi - \theta) 度:

q=[cos(θ2),sin(θ2)u]=[cos(πθ2),sin(πθ2)(u)](cos(πθ)=cos(θ),sin(πθ)=sin(θ))\begin{aligned} -q &= [-\cos(\frac{\theta}{2}), -\sin(\frac{\theta}{2})\pmb{u}]\\ &= [\cos(\pi - \frac{\theta}{2}), \sin(\pi - \frac{\theta}{2})(-\pmb{u})]\qquad (\cos(\pi - \theta) = -\cos(\theta), \sin(\pi - \theta) = \sin(\theta)) \end{aligned}

所以,这个四元数旋转的角度为 2(πθ2)=2πθ2(\pi - \frac{\theta}{2}) = 2\pi - \theta。从下面的图中我们可以看到,这两个旋转是完全等价的:

其实从四元数的旋转公式中也能推导出相同的结果

(q)v(q)=(1)2qvq=qvq(-q)v(-q)^* = (-1)^2qvq^* = qvq^*

所以,我们经常说单位四元数与 3D 旋转有一个“2对1满射同态”关系,或者说单位四元数“双倍覆盖”了 3D 旋转。

因为这个映射是满射,我们可以说所有的单位四元数都对应着一个 3D 旋转。或者说,一个四维单位超球面(也叫做 S3\mathbb{S}^3)上任意一点所对应的四元数(q=1\lVert q \rVert = 1)都对应着一个 3D 旋转。

有一点需要注意的是,虽然 qqq-q 是两个不同的四元数,但是由于旋转矩阵中的每一项都包含了四元数两个分量的乘积,它们的旋转矩阵是完全相同的。旋转矩阵并不会出现双倍覆盖的问题。

指数形式

在讨论复数的时候,我们利用欧拉公式将 2D 的旋转写成了 v=eiθvv' = e^{i\theta}v 这样的指数形式。实际上,我们也可以利用四元数将 3D 旋转写成类似的形式。

类似于复数的欧拉公式,四元数也有一个类似的公式,如果 u\pmb{u} 是一个单位向量,那么对于单位四元数 u=[0,u]u = [0, \pmb{u}],有

euθ=cos(θ)+usin(θ)=cos(θ)+usin(θ)e^{u\theta} = \cos(\theta) + u\sin(\theta) = \cos(\theta) + \pmb{u}\sin(\theta)

也就是说,q=[cos(θ),sin(θ)u]q = [\cos(\theta), \sin(\theta)\pmb{u}] 可以使用指数表示为 euθe^{u\theta}。这个公式的证明与欧拉公式的证明非常类似,直接使用级数展开就可以了。

ProofProof.

我们知道,exe^{x}sin(x)\sin(x)cos(x)\cos(x) 分别能用泰勒级数展开为:

ex=n=0xnn!=1+x+x22!+x33!+x44!+sin(x)=n=0(1)n(2n+1)!x2n+1=xx33!+x55!x77!+cos(x)=n=0(1)n(2n)!x2n=1x22!+x44!x66!+\begin{aligned} e^{x} &= \sum_{n=0}^{\infty}{\frac{x^{n}}{n!}} = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \dots\\ \sin(x) &= \sum_{n=0}^{\infty}{\frac{(-1)^n}{(2n + 1)!}x^{2n + 1}} = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \dots\\ \cos(x) &= \sum_{n=0}^{\infty}{\frac{(-1)^n}{(2n)!}x^{2n}} = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \dots\\ \end{aligned}

我们可以将 x=uθx = u\theta 代入 exe^x,得到

LHS=euθ=n=0(uθ)nn!=1+uθ+(uθ)22!+(uθ)33!+(uθ)44!+(uθ)55!+=1+uθ+u2θ22!+u3θ33!+u4θ44!+u5θ55!+\begin{aligned} LHS = e^{u\theta} &= \sum_{n=0}^{\infty}{\frac{(u\theta)^n}{n!}}\\ &= 1 + u\theta + \frac{(u\theta)^2}{2!} + \frac{(u\theta)^3}{3!} + \frac{(u\theta)^4}{4!} + \frac{(u\theta)^5}{5!} + \dots\\ &= 1 + u\theta + \frac{u^2\theta^2}{2!} + \frac{u^3\theta^3}{3!} + \frac{u^4\theta^4}{4!} + \frac{u^5\theta^5}{5!} + \dots\\ \end{aligned}

因为 u2=[uu,0]=u2=1u^2 = [-\pmb{u}\cdot\pmb{u}, \pmb{0}] = -\lVert u \rVert^2 = -1,我们可以对 euθe^{u\theta} 进一步化简

LHS=1+uθ+u2θ22!+uu2θ33!+(u2)2θ44!+u(u2)2θ55!+=1+uθθ22!uθ33!+θ44!+uθ55!\begin{aligned} LHS &= 1 + u\theta + \frac{u^2\theta^2}{2!} + \frac{uu^2\theta^3}{3!} + \frac{(u^2)^2\theta^4}{4!} + \frac{u(u^2)^2\theta^5}{5!} + \dots\\ &= 1 + u\theta - \frac{\theta^2}{2!} - \frac{u\theta^3}{3!} + \frac{\theta^4}{4!} + \frac{u\theta^5}{5!} - \dots\\ \end{aligned}

同理,将 θ\theta 代入 cos(x)\cos(x)sin(x)\sin(x)

sin(θ)=n=0(1)n(2n+1)!θ2n+1=θθ33!+θ55!θ77!+cos(θ)=n=0(1)n(2n)!θ2n=1θ22!+θ44!θ66!+\begin{aligned} \sin(\theta) &= \sum_{n=0}^{\infty}{\frac{(-1)^n}{(2n + 1)!}\theta^{2n + 1}}\\ &= \theta - \frac{\theta^3}{3!} + \frac{\theta^5}{5!} - \frac{\theta^7}{7!} + \dots\\ \\ \cos(\theta) &= \sum_{n=0}^{\infty}{\frac{(-1)^n}{(2n)!}\theta^{2n}}\\ &= 1 - \frac{\theta^2}{2!} + \frac{\theta^4}{4!} - \frac{\theta^6}{6!} + \dots\\ \end{aligned}

所以,

RHS=cos(θ)+usin(θ)=n=0(1)n(2n)!θ2n+un=0(1)n(2n+1)!θ2n+1=1+uθθ22!uθ33!+θ44!+uθ55!=LHS\begin{aligned} RHS &= \cos(\theta) + u\sin(\theta)\\ &= \sum_{n=0}^{\infty}{\frac{(-1)^n}{(2n)!}\theta^{2n}} + u\sum_{n=0}^{\infty}{\frac{(-1)^n}{(2n + 1)!}\theta^{2n + 1}}\\ &= 1 + u\theta - \frac{\theta^2}{2!} - \frac{u\theta^3}{3!} + \frac{\theta^4}{4!} + \frac{u\theta^5}{5!} - \dots = LHS \end{aligned}

因为 u\pmb{u} 是一个单位向量,u2=[uu,0]=u2=1u^2 = [-\pmb{u}\cdot\pmb{u}, \pmb{0}] = -\lVert u \rVert^2 = -1,这与欧拉公式中的 ii 是非常类似的。

有了指数型的表示方式,我们就能够将之前四元数的旋转公式改写为指数形式了:

Theorem 12:3D 旋转公式(指数型)
任意向量 v\pmb{v} 沿着以单位向量定义的旋转轴 u\pmb{u} 旋转 θ\theta 度之后的 v\pmb{v'} 可以使用四元数的指数表示。令 v=[0,v]u=[0,u]v = [0, \pmb{v}],u = [0, \pmb{u}],那么:

v=euθ2veuθ2v' = e^{u\frac{\theta}{2}}ve^{-u\frac{\theta}{2}}

有了四元数的指数定义,我们就能够定义四元数的更多运算了,首先是自然对数 log\log,对任意单位四元数 q=[cos(θ),sin(θ)u]q = [\cos(\theta), \sin(\theta)\pmb{u}]

log(q)=log(euθ)=[0,uθ]\log(q) = \log(e^{u\theta}) = [0, \pmb{u}\theta]

接下来是四元数的幂运算

qt=(euθ)t=eu(tθ)=[cos(tθ),sin(tθ)u]q^t = (e^{u\theta})^t = e^{u(t\theta)} = [\cos(t\theta), \sin(t\theta)\pmb{u}]

可以看到,一个单位四元数的 tt 次幂等同于将它的旋转角缩放至 tt 倍,并且不会改变它的旋转轴(uu 必须是单位向量,所以一般不能与 tt 结合)。这些运算会在之后讨论四元数插值时非常有用。


四元数和三维旋转(二)
http://example.com/posts/四元数和三维旋转(二)/
作者
祭零小白
发布于
2022年7月18日
许可协议