四元数和三维旋转(一)

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

由于使用欧拉角进行旋转时会存在万向锁的问题,同时,用欧拉角进行插值也不尽方便,而基于四元数的旋转既解决了万向锁的问题,又能非常方便地进行插值。本文将对在学习过程中遇到的四元数的定义、推导、性质、插值等问题进行总结归纳。

复数

我们先来简要讨论一下复数的一些性质以及它与 2D 旋转之间的关系,四元数的很多性质都与复数非常类似,所以理解复数的一些性质对理解四元数非常有帮助。

定义

任意一个复数 zCz \in \mathbb{C} 都可以表示为 z=a+biz = a + bi 的形式,其中 a,bRa,b \in \mathbb{R} 而且 i2=1i^2 = -1。我们将 aa 称为复数 zz 的实部,表示为 a=Re(z)a = Re(z)bb 称为复数 zz 的虚部,表示为 b=Im(z)b = Im(z)

因为 z=a+biz = a + bi 其实就是对于 1,i{1, i} 这个(Basis)的线性组合(Linear Combination),我们也可以用向量来表示一个复数:

z=[ab]z = \begin{bmatrix} a\\ b\\ \end{bmatrix}

因为这个向量有两个元素,我们可以使用复平面上的一个点来表示一个复数。复平面的横坐标代表它的实部,纵坐标代表它的虚部:

复数的加减法

如果我们有两个复数 z1=a+biz_{1} = a + biz2=c+diz_{2} = c + di,它们的和就是分量相加的结果:

z1+z2=(a+c)+(b+d)iz_{1} + z_{2} = (a + c) + (b + d)i

同理,如果要对它们相减,直接将分量相减就可以了。

z1z2=(ac)+(bd)iz_{1} - z_{2} = (a - c) + (b - d)i

复数的乘法

如果有两个复数 z1=a+biz_{1} = a + biz2=c+diz_{2} = c + di,我们可以使用分配律来计算它们的乘积

z1z2=(a+bi)(c+di)=ac+adi+bci+bdi2=acbd+adi+bci=acbd+(bc+ad)i\begin{aligned} z_{1}z_{2} &= (a + bi)(c + di)\\ &= ac + adi + bci + bdi^2\\ &= ac - bd + adi +bci\\ &= a\textcolor{red}{c} - b\textcolor{blue}{d} +\\ &\quad(b\textcolor{red}{c} + a\textcolor{blue}{d})i \end{aligned}

如果仔细观察可以发现,复数相乘的结果其实也是一个矩阵与向量相乘的结果,也就是说:

z1z2=acbd+(bc+ad)i=[abba][cd]\begin{aligned} z_{1}z_{2} &= a\textcolor{red}{c} - b\textcolor{blue}{d} +\\ &\quad(b\textcolor{red}{c} + a\textcolor{blue}{d})i\\ &= \begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix} \begin{bmatrix} \textcolor{red}{c}\\ \textcolor{blue}{d}\\ \end{bmatrix} \end{aligned}

右侧的 [cd]\begin{bmatrix}c\\ d \end{bmatrix} 是用向量的形式来表示的 z2z_{2},而左侧的 [abba]\begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix} 则是 z1z_{1} 的矩阵形式。我们可以发现,复数相乘这个运算,其实是与 [abba]\begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix} 则是 z1z_{1} 这个矩阵所代表的变换是等价的。

那么在矩阵形式下,复数与复数的相乘也可以表示为矩阵的相乘,如果我们有两个复数 z1=a+biz_{1} = a + biz2=c+diz_{2} = c + di,那么与 z1z2z_{1}z_{2} 所代表的变换则可以表示为

z1z2=[abba][cddc]=[acbd(bc+ad)bc+adacbd]\begin{aligned} z_{1}z_{2} &= \begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix} \begin{bmatrix} c&-d\\ d&c\\ \end{bmatrix}\\ &= \begin{bmatrix} ac - bd&-(bc + ad)\\ bc + ad&ac - bd\\ \end{bmatrix} \end{aligned}

复数的相乘满足交换律,即 z1z2z_{1}z_{2}z2z1z_{2}z_{1} 是等价的

z2z1=[cddc][abba]=[acbd(bc+ad)bc+adacbd]=z1z2\begin{aligned} z_{2}z_{1} &= \begin{bmatrix} c&-d\\ d&c\\ \end{bmatrix} \begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix}\\ &= \begin{bmatrix} ac - bd&-(bc + ad)\\ bc + ad&ac - bd\\ \end{bmatrix} = z_{1}z_{2} \end{aligned}

除此之外,我们来看一下一些特殊的矩阵形式:

1=[1001]=I(a=1,b=0)1 = \begin{bmatrix} 1&0\\ 0&1\\ \end{bmatrix} = I \quad(a = 1, b = 0)

i=[0110](a=0,b=1)i = \begin{bmatrix} 0&-1\\ 1&0\\ \end{bmatrix} \quad(a = 0, b = 1)

实数单位 1 与矩阵单位矩阵是等价的,而虚数单位 ii 则等价于 [0110]\begin{bmatrix} 0&-1\\ 1&0\\ \end{bmatrix},如果我们尝试对它进行平方,可以发现:

i2=ii=[0110][0110]=[1001]=I=1i^2 = i \cdot i = \begin{bmatrix} 0&-1\\ 1&0\\ \end{bmatrix} \begin{bmatrix} 0&-1\\ 1&0\\ \end{bmatrix} = \begin{bmatrix} -1&0\\ 0&-1\\ \end{bmatrix} = -I = -1

即便实在矩阵形式下,i2i^2 与 -1 其实也是等价的,这进一步展示了复数与这一矩阵形式的关联。

复数的模长与共轭

复数 z=a+biz = a + bi模长(Magnitude)定义为

z=a2+b2\lVert z \rVert = \sqrt{a^2 + b^2}

复数 z=a+biz = a + bi共轭(Conjugate)定义为

zˉ=abi\bar{z} = a - bi

如果尝试计算 zzˉz\bar{z},我们就会发现

zzˉ=(a+bi)(abi)=a2abi+abi+b2=a2+b2=z2\begin{aligned} z\bar{z} &= (a + bi)(a - bi)\\ &= a^2 - abi + abi + b^2\\ &= a^2 + b^2 = {\lVert z \rVert}^2 \end{aligned}

所以,一个复数的模长又可以通过下面的方式计算

z=zzˉ\lVert z \rVert = \sqrt{z\bar{z}}

复数与二维旋转

注意观察复数 zz 的矩阵形式 [abba]\begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix},我们可以把它变换为下述形式:

[abba]=a2+b2[aa2+b2ba2+b2ba2+b2aa2+b2]\begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix} = \sqrt{a^2 + b^2} \begin{bmatrix} \frac{a}{\sqrt{a^2 + b^2}}&\frac{-b}{\sqrt{a^2 + b^2}}\\ \frac{b}{\sqrt{a^2 + b^2}}&\frac{a}{\sqrt{a^2 + b^2}}\\ \end{bmatrix}

可以看到,z\lVert z \rVert 正是复数 zz 与坐标轴所形成的三角形的斜边长,而 aabb 分别为三角形的两个直角边.如果将斜边与实数轴正方向的夹角记为 θ\theta 的话,按照三角函数的定义可以得出 aa2+b2=cos(θ)\frac{a}{\sqrt{a^2 + b^2}} = \cos(\theta)ba2+b2=sin(θ)\frac{b}{\sqrt{a^2 + b^2}} = \sin(\theta),这个角度 θ\theta 其实就是 atan2(b,a)atan2(b, a)。知道了这些,原矩阵就可以变形为

[abba]=a2+b2[cos(θ)sin(θ)sin(θ)cos(θ)]=z[cos(θ)sin(θ)sin(θ)cos(θ)]=zI[cos(θ)sin(θ)sin(θ)cos(θ)]=[z00z][cos(θ)sin(θ)sin(θ)cos(θ)]\begin{aligned} \begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix} &= \sqrt{a^2 + b^2} \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix}\\ &= \lVert z \rVert \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix}\\ &= \lVert z \rVert \cdot I \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix}\\ &= \begin{bmatrix} \lVert z \rVert&0\\ 0&\lVert z \rVert\\ \end{bmatrix} \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix}\\ \end{aligned}

其中,左边的 [z00z]\begin{bmatrix}\lVert z \rVert&0\\ 0&\lVert z \rVert\\ \end{bmatrix} 是缩放矩阵,而右边的 [cos(θ)sin(θ)sin(θ)cos(θ)]\begin{bmatrix}\cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix} 是 2D 旋转矩阵。

让我们看看这个矩阵对两个基 [10]\begin{bmatrix}1\\ 0 \end{bmatrix}[01]\begin{bmatrix}0\\ 1 \end{bmatrix} 的变换效果,首先是 [10]\begin{bmatrix}1\\ 0 \end{bmatrix}:

[abba][10]=[z00z][cos(θ)sin(θ)sin(θ)cos(θ)][10]=[z00z][cos(θ)sin(θ)]\begin{aligned} \begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix} \begin{bmatrix} 1\\ 0\\ \end{bmatrix} &= \begin{bmatrix} \lVert z \rVert&0\\ 0&\lVert z \rVert\\ \end{bmatrix} \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix} \begin{bmatrix} 1\\ 0\\ \end{bmatrix}\\ &= \begin{bmatrix} \lVert z \rVert&0\\ 0&\lVert z \rVert\\ \end{bmatrix} \begin{bmatrix} \cos(\theta)\\ \sin(\theta)\\ \end{bmatrix} \end{aligned}

第一步首先将 [10]\begin{bmatrix}1\\ 0 \end{bmatrix} 变换到了 [cos(θ)sin(θ)]\begin{bmatrix}\cos(\theta)\\ \sin(\theta) \end{bmatrix} 的位置,也就是逆时针旋转了 θ\theta 度,接下来

[z00z][cos(θ)sin(θ)]=[zcos(θ)zsin(θ)]\begin{bmatrix} \lVert z \rVert&0\\ 0&\lVert z \rVert\\ \end{bmatrix} \begin{bmatrix} \cos(\theta)\\ \sin(\theta)\\ \end{bmatrix} = \begin{bmatrix} \lVert z \rVert\cos(\theta)\\ \lVert z \rVert\sin(\theta)\\ \end{bmatrix}

缩放矩阵将 [cos(θ)sin(θ)]\begin{bmatrix}\cos(\theta)\\ \sin(\theta)\\ \end{bmatrix} 缩放了 z\lVert z \rVert 倍,变为 [zcos(θ)zsin(θ)]\begin{bmatrix}\lVert z \rVert\cos(\theta)\\ \lVert z \rVert\sin(\theta)\\ \end{bmatrix}。总的来说,就是对 [10]\begin{bmatrix}1\\ 0 \end{bmatrix} 旋转了 θ\theta 度,并缩放了 z\lVert z \rVert 倍。

接下来是 [01]\begin{bmatrix}0\\ 1 \end{bmatrix}

[abba][01]=[z00z][cos(θ)sin(θ)sin(θ)cos(θ)][01]=[z00z][sin(θ)cos(θ)]\begin{aligned} \begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix} \begin{bmatrix} 0\\ 1\\ \end{bmatrix} &= \begin{bmatrix} \lVert z \rVert&0\\ 0&\lVert z \rVert\\ \end{bmatrix} \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix} \begin{bmatrix} 0\\ 1\\ \end{bmatrix}\\ &= \begin{bmatrix} \lVert z \rVert&0\\ 0&\lVert z \rVert\\ \end{bmatrix} \begin{bmatrix} -\sin(\theta)\\ \cos(\theta)\\ \end{bmatrix} \end{aligned}

这里,第一步将 [01]\begin{bmatrix}0\\ 1 \end{bmatrix} 变换到了 [sin(θ)cos(θ)]\begin{bmatrix}-\sin(\theta)\\ \cos(\theta) \end{bmatrix} 的位置,这同样是逆时针旋转了 θ\theta 度,见下图:

第二步变换同样会将 [sin(θ)cos(θ)]\begin{bmatrix}-\sin(\theta)\\ \cos(\theta) \end{bmatrix} 缩放为 [zsin(θ)zcos(θ)]\begin{bmatrix}-\lVert z \rVert\sin(\theta)\\ \lVert z \rVert\cos(\theta) \end{bmatrix}。这样等于是将整个坐标系逆时针旋转了 θ\theta 度,并缩放了 z\lVert z \rVert 倍。

换句话说,复数相乘的几何意义就是旋转与缩放变换的复合。如果有一个复数 z=a+biz = a + bi,那么 zz 与任意一个复数 cc 相乘都会将 cc 逆时针旋转 θ=atan2(b,a)\theta = atan2(b, a) 度,并将其缩放 z=a2+b2\lVert z \rVert = \sqrt{a^2 + b^2} 倍。

如果复数的模长为 1,那么它的几何意义就只有旋转。

z=[cos(θ)sin(θ)sin(θ)cos(θ)]z = \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix}

如果我们想让 2D 空间中任意一个向量 v\vec{v} 旋转 θ\theta 度,那么我们就可以使用这个矩阵对 v\vec{v} 进行变换:

Theorem 1:2D 旋转公式(矩阵型)

v=[cos(θ)sin(θ)sin(θ)cos(θ)]v\vec{v'} = \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\\end{bmatrix}\vec{v}

其实 [cos(θ)sin(θ)sin(θ)cos(θ)]\begin{bmatrix}\cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix} 这个旋转矩阵如果写成复数形式的话就是 cos(θ)+isin(θ)\cos(\theta) + i\sin(\theta)

如果我们将向量 v=[xy]\vec{v} = \begin{bmatrix} x\\ y\\ \end{bmatrix} 看作是一个复数 v=x+yiv = x + yi,其中实部为 xx,虚部为 yy。那么我们可以构造一个复数 z=cos(θ)+isin(θ)z = \cos(\theta) + i\sin(\theta),并将它与 vv 相乘来进行旋转,旋转 θ\theta 度之后的向量 vv' 可以用等价的复数乘法来表示:

Theorem 2:2D 旋转公式(复数积型)

v=zv=(cos(θ)+isin(θ))v\begin{aligned}v' &= zv\\&= (\cos(\theta) + i\sin(\theta)) v\end{aligned}

复数的极坐标型

cos(θ)+isin(θ)\cos(\theta) + i\sin(\theta) 还可以进行下一步的变形,根据欧拉公式(Euler’s Formula),

cos(θ)+isin(θ)=eiθ\cos(\theta) + i\sin(\theta) = e^{i\theta}

欧拉公式的证明:

f(θ)=cos(θ)+isin(θ)eiθ=eiθ(cos(θ)+isin(θ))f(\theta) = \frac{\cos(\theta) + i\sin(\theta)}{e^{i\theta}} = e^{-i\theta}(\cos(\theta) + i\sin(\theta)),对实数 θ\theta,对 f(θ)f(\theta) 求导,得到 f(θ)=eiθ(icos(θ)sin(θ))ieiθ(cos(θ)+isin(θ))=0f'(\theta) = e^{-i\theta}(i\cos(\theta) - \sin(\theta)) - ie^{-i\theta}(\cos(\theta) + i\sin(\theta)) = 0,因此 f(θ)f(\theta) 是常数。又因为 f(0)=1f(0) = 1,所以 f(θ)1f(\theta) \equiv 1。欧拉公式得证。

有了这个等式,我们就能将复数表示为

z=z[cos(θ)sin(θ)sin(θ)cos(θ)]=z(cos(θ)+isin(θ))=zeiθ\begin{aligned} z &= \lVert z \rVert \begin{bmatrix} \cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix} &= \lVert z \rVert (\cos(\theta) + i\sin(\theta)) &= \lVert z \rVert e^{i\theta} \end{aligned}

如果我们定义 r=zr = \lVert z \rVert,我们就得到了复数的极坐标形式:

z=reiθz = re^{i\theta}

现在复数的定义就与实部与虚部的两个分量 aabb 无关了,我们可以使用一个缩放因子 rr 和旋转角度 θ\theta 的形式来定义任意一个复数,而且它旋转与缩放的性质仍然存在。如果我们想对 2D 空间中的向量 v=[xy]\vec{v} = \begin{bmatrix} x\\ y\\ \end{bmatrix} 进行旋转并缩放,我们可以类似地将这个向量看作是一个复数 v=x+yiv = x + yi,那么,经过旋转 θ\theta 度,缩放 rr 倍之后的向量 vv' 就可以这样计算:

v=reiθvv' = re^{i\theta}v

如果仅需要旋转 θ\theta 度的话,可以令缩放因子 r=1r = 1,那么变换后的结果就是

Theorem 3:2D 旋转公式(指数型)

v=eiθvv' = e^{i\theta}v

复数的几种表示形式总结

  • 代数形式一:z=a+biz = a + bi
  • 代数形式二:z=r(cos(θ)+isin(θ))z = r(\cos(\theta) + i\sin(\theta))
  • 向量形式:z=[ab]z = \begin{bmatrix}a\\ b\\ \end{bmatrix}
  • 矩阵形式一:[abba]\begin{bmatrix} a&-b\\ b&a\\ \end{bmatrix}
  • 矩阵形式二:[z00z][cos(θ)sin(θ)sin(θ)cos(θ)]\begin{bmatrix}\lVert z \rVert&0\\ 0&\lVert z \rVert\\ \end{bmatrix} \begin{bmatrix}\cos(\theta)&-\sin(\theta)\\ \sin(\theta)&\cos(\theta)\\ \end{bmatrix}\\
  • 极坐标形式:z=reiθz = re^{i\theta}

这几种形式完全等价

旋转的复合

如果我们有两个代表 2D 旋转的单位复数 z1=cos(θ)+isin(θ)z_{1} = \cos(\theta) + i\sin(\theta)z2=cos(ϕ)+isin(ϕ)z_{2} = \cos(\phi) + i\sin(\phi) 以及一个向量 v=x+yiv = x + yi,我们可以先对 vv 进行 z1z_{1} 的旋转

v=z1vv' = z_{1}v

在此基础上,我们对 vv' 进行 z2z_{2} 的旋转

v=z2(z1v)=(z2z1)v\begin{aligned} v'' &= z_{2}(z_{1}v)\\ &= (z_{2}z_{1})v \end{aligned}

如果我们将这两次旋转所作出的等效变换称为 znetz_{net},那么

v=(z2z1)v=znetvznet=z2z1\begin{aligned} v'' &= (z_{2}z_{1})v = z_{net}v\\ z_{net} &= z_{2}z_{1} \end{aligned}

因为复数的相乘遵守交换律,所以

znet=z2z1=z1z2z_{net} = z_{2}z_{1} = z_{1}z_{2}

如果尝试计算一下 znetz_{net},会发现

znet=(cos(θ)+isin(θ))(cos(ϕ)+isin(ϕ))=cos(θ)cos(ϕ)+i(cos(θ)sin(ϕ))+i(sin(θ)cos(ϕ))sin(θ)sin(ϕ)=(cos(θ)cos(ϕ)sin(θ)sin(ϕ))+(cos(θ)sin(ϕ)+sin(θ)cos(ϕ))i\begin{aligned} z_{net} &= (\cos(\theta) + i\sin(\theta))(\cos(\phi) + i\sin(\phi))\\ &= \cos(\theta)\cos(\phi) + i(\cos(\theta)\sin(\phi)) + i(\sin(\theta)\cos(\phi)) - \sin(\theta)\sin(\phi)\\ &= (\cos(\theta)\cos(\phi) - \sin(\theta)\sin(\phi)) + (\cos(\theta)\sin(\phi) + \sin(\theta)\cos(\phi))i \end{aligned}

这个式子可以利用三角恒等式化简为:

znet=(cos(θ)+isin(θ))(cos(ϕ)+isin(ϕ))=cos(θ+ϕ)+isin(θ+ϕ)\begin{aligned} z_{net} &= (\cos(\theta) + i\sin(\theta))(\cos(\phi) + i\sin(\phi))\\ &= \cos(\theta + \phi) + i\sin(\theta + \phi) \end{aligned}

所以,当我们对两个 2D 旋转进行复合时,所得到的变换 znetz_{net} 仍是一个旋转,而且与施加的次序无关。这个等效变换的旋转角是 $z_{1} 与 $z_{2} 旋转角之和。

轴角式旋转

假设我们有一个经过原点的(如果旋转轴不经过原点我们可以先将旋转轴平移到原点,进行旋转,再平移回原处)旋转轴 u=(x,y,z)T\vec{u} = (x,y,z)^T,我们希望将一个向量 v\vec{v},沿着这个旋转轴旋转 θ\theta 度,变换到 v\vec{v'}

我们使用右手坐标系统,并且将使用右手定则来定义旋转的正方向。你可以将右手拇指指向旋转轴 u\vec{u} 的正方向,这时其他四个手指弯曲的方向即为旋转的正方向。在上图中即为逆时针方向。

为了消除旋转轴 u\vec{u} 模长这个多余的自由度,我们可以规定 u\vec{u} 的模长为 1,即 u\vec{u} 是一个单位向量。规定 u\vec{u} 为单位向量后能为我们带来很多便利,这也是数学和物理中对方向定义的惯例。如果 u\vec{u} 不是一个单位向量,我们可以通过下面的公式将它转化为一个单位向量

u^=uu\hat{u} = \frac{\vec{u}}{\lVert \vec{u} \rVert}

旋转的分解

我们可以将 v\vec{v} 分解为平行于旋转轴 u\vec{u} 以及正交u\vec{u} 的两个分量,v\vec{v_{\parallel}}v\vec{v_{\perp}},即

v=v+v\vec{v} = \vec{v_{\parallel}} + \vec{v_{\perp}}

我们可以分别旋转这两个分量,再将它们旋转的结果相加获得旋转后的向量

v=v+v\vec{v'} = \vec{v_{\parallel}'} + \vec{v_{\perp}'}

下面是分解的示意图:

可以看到,v\vec{v_{\parallel}} 其实就是 v\vec{v}u\vec{u} 上的正交投影,根据正交投影公式,我们可以得出:

v=proju(v)=uvuuu=uvu2u=(uv)u\begin{aligned} \vec{v_{\parallel}} &= proj_{u}(\vec{v})\\ &= \frac{\vec{u}\cdot\vec{v}}{\vec{u}\cdot\vec{u}}\vec{u}\\ &= \frac{\vec{u}\cdot\vec{v}}{\lVert \vec{u} \rVert ^2}\vec{u}\\ &= (\vec{u}\cdot\vec{v})\vec{u} \end{aligned}

因为 v=v+v\vec{v} = \vec{v_{\parallel}} + \vec{v_{\perp}},我们可以得到

v=vv=v(uv)u\begin{aligned} \vec{v_{\perp}} &= \vec{v} - \vec{v_{\parallel}}\\ &= \vec{v} - (\vec{u}\cdot\vec{v})\vec{u} \end{aligned}

v\vec{v_{\parallel}} 的旋转

从之前的图示中可以看到,v\vec{v_{\parallel}} 其实没有被旋转,仍然与旋转轴 u\vec{u} 重合,所以

Theorem 4:3D 旋转公式(向量型,平行情况)
v\vec{v_{\parallel}} 平行于旋转轴 u\vec{u} 时,旋转 θ\theta 角度之后的 v\vec{v_{\parallel}'} 为:

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

v\vec{v_{\perp}} 的旋转

接下来,我们需要处理正交于 u\vec{u}v\vec{v_{\perp}}。因为这两个向量是正交的,这个旋转可以看作是平面内的一个旋转。因为旋转不改变 v\vec{v_{\perp}} 的长度,所以路径是一个园。下面是这个旋转的示意图,右侧的为俯视图:

现在,3D 的旋转就被我们转化为了 2D 平面上的旋转,由于在这个平面上我们只有一个向量 v\vec{v_{\perp}},用它来表示一个旋转是不够的,我们还需构造一个同时正交于 u\vec{u}v\vec{v_{\perp}} 的向量 w\vec{w},这个可以通过叉乘来获得

w=u×v\vec{w} = \vec{u}\times\vec{v_{\perp}}

注意叉乘的顺序,因为我们使用的是右手坐标系统,按右手定则这个新的向量 w\vec{w} 指向 v\vec{v_{\perp}} 逆时针旋转 π/2\pi / 2 后的方向,并且和 v\vec{v_{\perp}} 一样也处于正交于 u\vec{u} 的平面内,因为 u=1\lVert\vec{u}\rVert = 1,我们可以发现:

w=u×v=uvsin(π/2)=v\begin{aligned} \lVert\vec{w}\rVert &= \lVert\vec{u}\times\vec{v_{\perp}}\rVert\\ &= \lVert\vec{u}\rVert\cdot\lVert\vec{v_{\perp}}\rVert\cdot\sin(\pi/2)\\ &= \lVert\vec{v_{\perp}}\rVert \end{aligned}

w\vec{w}v\vec{v_{\perp}} 的模长相同,且 w\vec{w} 也位于圆上,我们可以将 w\vec{w}v\vec{v_{\perp}} 作为平面内的两个坐标轴,我们现在可以把 v\vec{v_{\perp}'} 投影到 w\vec{w}v\vec{v_{\perp}} 上,将其分解为 vv\vec{v_{v}'}vw\vec{v_{w}'},利用三角形的知识我们可以得到:

v=vv+vw=cos(θ)v+sin(θ)w=cos(θ)v+sin(θ)(u×v)\begin{aligned} \vec{v_{\perp}'} &= \vec{v_{v}'} + \vec{v_{w}'}\\ &= \cos(\theta)\vec{v_{\perp}} + \sin(\theta)\vec{w}\\ &= \cos(\theta)\vec{v_{\perp}} + \sin(\theta)(\vec{u}\times\vec{v_{\perp}}) \end{aligned}

Theorem 5:3D 旋转公式(向量型,正交情况)
v\vec{v_{\perp}} 正交于旋转轴 u\vec{u} 时,旋转 θ\theta 角度之后的 v\vec{v_{\perp}'} 为:

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

v\vec{v} 的旋转

将上面两个结果组合可以获得:

v=v+v=v+cos(θ)v+sin(θ)(u×v)\begin{aligned} \vec{v'} &= \vec{v_{\parallel}'} + \vec{v_{\perp}'}\\ &= \vec{v_{\parallel}} + \cos(\theta)\vec{v_{\perp}} + \sin(\theta)(\vec{u}\times\vec{v_{\perp}}) \end{aligned}

因为叉乘遵守分配律,

u×v=u×(vv)=u×vu×v=u×v(u平行于v,所以u×v=0)\begin{aligned} \vec{u}\times\vec{v_{\perp}} &= \vec{u}\times(\vec{v} - \vec{v_{\parallel}})\\ &= \vec{u}\times\vec{v} - \vec{u}\times\vec{v_{\parallel}}\\ &= \vec{u}\times\vec{v}\quad (\vec{u} 平行于 \vec{v_{\parallel}},所以 \vec{u}\times\vec{v_{\parallel}} = \vec{0}) \end{aligned}

最后,将 v=(uv)u\vec{v_{\parallel}} = (\vec{u}\cdot\vec{v})\vec{u}v=v(uv)u\vec{v_{\perp}} = \vec{v} - (\vec{u}\cdot\vec{v})\vec{u} 代入

v=(uv)u+cos(θ)(v(uv)u)+sin(θ)(u×v)=cos(θ)v+(1cos(θ))(uv)u+sin(θ)(u×v)\begin{aligned} \vec{v'} &= (\vec{u}\cdot\vec{v})\vec{u} + \cos(\theta)(\vec{v} - (\vec{u}\cdot\vec{v})\vec{u}) + \sin(\theta)(\vec{u}\times\vec{v})\\ &= \cos(\theta)\vec{v} + (1 - \cos(\theta))(\vec{u}\cdot\vec{v})\vec{u} + \sin(\theta)(\vec{u}\times\vec{v}) \end{aligned}

这样我们就得到了一般形式的旋转公式:

Theorem 6:3D 旋转公式(向量型,一般情况)
3D 空间中任意一个 v\vec{v} 沿着单位向量 u\vec{u} 旋转 θ\theta 角度之后的 v\vec{v_{\perp}'} 为:

v=cos(θ)v+(1cos(θ))(uv)u+sin(θ)(u×v)\vec{v'} = \cos(\theta)\vec{v} + (1 - \cos(\theta))(\vec{u}\cdot\vec{v})\vec{u} + \sin(\theta)(\vec{u}\times\vec{v})


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