四元数及旋转有关证明

 
  
  四元数是用来表示旋转与方向的工具,它在 1843 年由 William Rowan Hanmilton 发明,作为复数的一个拓展被提出,直到 1985 年由 Shoemake 引入到计算机图形学中。四元数在许多方面都比欧拉角以及矩阵更优秀,在计算机图形学领域被广泛运用。任何三维方向都可以表达为一个绕特定轴的旋转,如果给定了轴和角度,可以非常直白地得到四元数,而欧拉角的转换就要复杂得多;四元数可以用于稳定均匀的方向插值,而欧拉角在这一领域并不能做得很好。

四元数的数学背景

  记四元数为 \mathbf{\hat{q}},实部为一个实数,与旋转角度有关,记为 q_w,虚部为三个实数,与旋转轴有关,记为 \mathbf{q}_v,有如下定义:
\mathbf{\hat{q}}=(\mathbf{q}_v,q_w)=iq_x+jq_y+kq_z+q_w=\mathbf{q}_v+q_w \mathbf{q}_v=iq_x+jq_y+kq_z=(q_x,q_y,q_z) i^2=j^2+k^2=-1,jk=-kj=i,ki=-ik=j,ij=-ji=k   虚部 \mathbf{q}_v 可以使用通常的向量操作,比如加法、缩放、点乘、叉乘。根据四元数的定义,两个四元数 \mathbf{\hat{q}}\mathbf{\hat{r}} 的乘法可以定义为
\begin{aligned}
\mathbf{\hat{q}\hat{r}}&=(iq_x+jq_y+kq_z+q_w)(ir_x+jr_y+kr_z+r_w) \\
&=(\mathbf{q}_v \times \mathbf{r}_v+r_w \mathbf{q}_v+q_w \mathbf{r}_v,q_wr_w- \mathbf{q}_v \cdot \mathbf{r}_v)
\end{aligned}
  加法:
\mathbf{\hat{q}}+\mathbf{\hat{r}}=(\mathbf{q}_v,q_w)+(\mathbf{r}_v,r_w)=(\mathbf{q}_v+\mathbf{r}_v,q_w+r_w)   共轭:
\mathbf{\hat{q}}^*=(\mathbf{q}_v,q_w)^*=(-\mathbf{q}_v,q_w)   模:
\begin{aligned}
n(\mathbf{\hat{q}})&=\sqrt{\mathbf{\hat{q}}\mathbf{\hat{q}}^*}=\sqrt{\mathbf{\hat{q}}^*\mathbf{\hat{q}}}=\sqrt{\mathbf{q}_v \cdot \mathbf{q}_v+q_w^2}\\
&=\sqrt{q_x^2+q_y^2+q_z^2+q_w^2}
\end{aligned}
  逆:
\mathbf{\hat{q}}^{-1}={1 \over n(\mathbf{\hat{q}})^2}\mathbf{\hat{q}^*}   对于单位四元数 n(\mathbf{\hat{q}})=1,轴方向的单位向量 \mathbf{u}_q\lVert \mathbf{u}_q\rVert=1,可以写为
\mathbf{\hat{q}}=(sin\phi \mathbf{u}_q,cos\phi)=sin\phi\mathbf{u}_q+cos\phi=e^{\phi\mathbf{u}_q}
  e 为底对数:
log(\mathbf{\hat{q}})=log(e^{\phi\mathbf{u}_q})=\phi\mathbf{u}_q   幂:
\mathbf{\hat{q}}^t=(sin\phi\mathbf{u}_q+cos\phi)^t=e^{\phi t\mathbf{u}_q}=sin(\phi t)\mathbf{u}_q+cos(\phi t)

四元数变换

  单位四元数可以非常简洁地表示任意三维旋转。对于一个点或者向量的四元数 \mathbf{\hat{p}},有另一个四元数 \mathbf{\hat{q}}=(sin\phi \mathbf{u}_q,cos\phi) ,可得:
\mathbf{\hat{q}}\mathbf{\hat{p}}\mathbf{\hat{q}}^{-1}   表示点或向量 \mathbf{\hat{p}} 绕轴 \mathbf{u}_q 旋转了角度 2\phi

四元数与矩阵相互转换

  在图形系统中,经常需要结合不同的转换,最常用的就是矩阵。对于单位四元数 \mathbf{\hat{q}} ,可以转化为矩阵 \mathbf{M}^q
\mathbf{M}^q=
\begin{pmatrix}
1-2(q_y^2+q_z^2)&2(q_xq_y-q_wq_z)&2(q_xq_z+q_wq_y)&0\\
2(q_xq_y+q_wq_z)&1-2(q_x^2+q_z^2)&2(q_yq_z-q_wq_x)&0\\
2(q_xq_z-q_wq_y)&2(q_yq_z+q_wq_x)&1-2(q_x^2+q_y^2)&0\\
0&0&0&1
\end{pmatrix}
  矩阵转四元数就要复杂一些。从上述矩阵可以得到方程组:
m_{21}^q-m_{12}^q=4q_wq_x\\
m_{02}^q-m_{20}^q=4q_wq_y\\
m_{10}^q-m_{01}^q=4q_wq_z
  如果 q_w 的值是已知的,就可以得到其他三个值。这里,矩阵 \mathbf{M}^q 的迹有
tr(\mathbf{M}^q)=4(1-{q_x^2+q_y^2+q_z^2\over q_x^2+q_y^2+q_z^2+q_w^2})={4q_w^2\over (n(\mathbf{\hat{p}}))^2}  所以,可以解得
q_w={1\over 2}\sqrt{tr(\mathbf{M}^q)},\,\,\,\,q_x={m_{21}^q-m_{12}^q\over 4q_w}\\
q_y={m_{02}^q-m_{20}^q\over 4q_w},\,\,\,\,q_x={m_{10}^q-m_{01}^q\over 4q_w}
  但是,如果要保证数据计算的稳定性,必须避免除以非常小的浮点数。这里,设 t=q_w^2-q_x^2-q_y^2-q_z^2,有
\begin{aligned}
m_{00}&=t+2q_x^2\\
m_{11}&=t+2q_y^2\\
m_{22}&=t+2q_z^2\\
u&=m_{00}+m_{11}+m_{22}=t+2q_w^2
\end{aligned}
  通过上述四个表达式就可以比较 q_xq_yq_zq_w 值的大小,如果 q_w 是最大的,就使用上述方法进行计算。否则,先求得任意最大的数,带入上述方程组就能解得其他值:
\begin{aligned}
4q_x^2&=+m_{00}-m_{11}-m_{22}+m_{33}\\
4q_y^2&=-m_{00}+m_{11}-m_{22}+m_{33}\\
4q_z^2&=-m_{00}-m_{11}+m_{22}+m_{33}
\end{aligned}

球面线性插值

  均匀的球面插值对于动画领域是非常重要的。线性插值几何表达式为:
\mathbf{\hat{s}}(\mathbf{\hat{q}},\mathbf{\hat{r}},t)=(\mathbf{\hat{r}}\mathbf{\hat{q}}^{-1})^t\mathbf{\hat{q}}  但是,在具体实现时,通常会使用如下形式:
\mathbf{\hat{s}}(\mathbf{\hat{q}},\mathbf{\hat{r}},t)=slerp(\mathbf{\hat{q}},\mathbf{\hat{r}},t)={sin(\phi(1-t))\over sin\phi}\mathbf{\hat{q}}+{sin(\phi t)\over sin\phi}\mathbf{\hat{r}}


证明

1.证明:有 \mathbf{\hat{q}}=(\cos{\alpha\over 2} + \mathbf{u} \sin {\alpha\over 2})) 时, \mathbf{\hat{q}}\mathbf{\hat{p}}\mathbf{\hat{q}}^{-1} 表示由点或者四元数绕 \mathbf{u} 旋转 \alpha 角度的结果。
 
  假设有两个只有虚部的单位四元数 \mathbf{\hat{u}}=(\mathbf{u},0)\mathbf{\hat{v}}=(\mathbf{v},0),由四元数乘法法则可得:
\begin{aligned}
\mathbf{\hat{u}}\mathbf{\hat{v}}&=(\mathbf{u}\times\mathbf{v},-\mathbf{u}\cdot \mathbf{v})=\mathbf{u}\times\mathbf{v}-\mathbf{u}\cdot \mathbf{v}\end{aligned}
  这里涉及三种运算:
 
\cdot \mathbf{\hat{u}}\mathbf{\hat{v}}:四元数乘法,如上文所示。
\cdot \mathbf{u}\times\mathbf{v}:向量叉乘,是一个向量
\cdot \mathbf{u}\cdot \mathbf{v}:向量点乘,是一个标量
 
  下面两个等式将会在后续证明中用到。对于四元数乘法,有如下变换:
\begin{aligned}
\mathbf{\hat{u}}\mathbf{\hat{v}}&=\mathbf{u}\times \mathbf{v}-\mathbf{u}\cdot \mathbf{v}\\&=-\mathbf{v}\times \mathbf{u} +\mathbf{u}\cdot \mathbf{v} -2(\mathbf{u}\cdot \mathbf{u})\\&=-\mathbf{\hat{v}}\mathbf{\hat{u}}-2(\mathbf{u}\cdot \mathbf{v})
\end{aligned}
  所以:
\mathbf{\hat{u}}\mathbf{\hat{v}}\mathbf{\hat{u}}=(-\mathbf{\hat{v}}\mathbf{\hat{u}}-2(\mathbf{u}\cdot \mathbf{v}))\mathbf{\hat{u}}=-\mathbf{\hat{v}}\mathbf{\hat{u}}\mathbf{\hat{u}}-2\mathbf{\hat{u}}(\mathbf{u}\cdot \mathbf{v})=\mathbf{\hat{v}}(\mathbf{u}\cdot \mathbf{u})-2\mathbf{\hat{u}}(\mathbf{u}\cdot \mathbf{v})

  所以,对于任意的 \mathbf{\hat{v}},都有
\begin{aligned}
\mathbf{\hat{v}}’ &= \mathbf{\hat{q}} \mathbf{\hat{v}} \mathbf{\hat{q}}^{-1} = ( \cos \frac{\alpha}{2} + \mathbf{\hat{u}} \sin \frac{\alpha}{2} ) \, \mathbf{\hat{v}} \, ( \cos \frac{\alpha}{2} – \mathbf{\hat{u}} \sin \frac{\alpha}{2} ) \\
&= \mathbf{\hat{v}} \cos^2 \frac{\alpha}{2} + (\mathbf{u}\mathbf{v} – \mathbf{v}\mathbf{u}) \sin \frac{\alpha}{2} \cos \frac{\alpha}{2} – \mathbf{\hat{u}}\mathbf{\hat{v}}\mathbf{\hat{u}} \sin^2 \frac{\alpha}{2} \\
&= \mathbf{\hat{v}} \cos^2 \frac{\alpha}{2} + 2 (\mathbf{u} \times \mathbf{v}) \sin \frac{\alpha}{2} \cos \frac{\alpha}{2} – (\mathbf{\hat{v}} (\mathbf{u} \cdot \mathbf{u}) – 2 \mathbf{\hat{u}} (\mathbf{u} \cdot \mathbf{v})) \sin^2 \frac{\alpha}{2} \\
&= \mathbf{\hat{v}} (\cos^2 \frac{\alpha}{2} – \sin^2 \frac{\alpha}{2}) + (\mathbf{\hat{u}} \times \mathbf{\hat{v}}) (2 \sin \frac{\alpha}{2} \cos \frac{\alpha}{2}) + \mathbf{\hat{u}} (\mathbf{u} \cdot \mathbf{v}) (2 \sin^2 \frac{\alpha}{2}) \\
&= \mathbf{\hat{v}} \cos \alpha + (\mathbf{u} \times \mathbf{v}) \sin \alpha + \mathbf{\hat{u}} (\mathbf{u} \cdot \mathbf{v}) (1 – \cos \alpha) \\
\end{aligned}
  这里是四元数的形式,如果将结果只取虚部,则有:
\mathbf{v}’= \mathbf{v} \cos \alpha + (\mathbf{u} \times \mathbf{v}) \sin \alpha + \mathbf{u} (\mathbf{u} \cdot \mathbf{v}) (1 – \cos \alpha)  这就是旋转公式 Rodrigues’ rotation formula 的标准形式。
  如果将结果转化的更直观,可以继续合并同类项,有:
\begin{aligned}
\mathbf{v}’
&= (\mathbf{\hat{v}} – \mathbf{\hat{u}} (\mathbf{u} \cdot \mathbf{v})) \cos \alpha + (\mathbf{u} \times \mathbf{v}) \sin \alpha + \mathbf{\hat{u}} (\mathbf{u} \cdot \mathbf{v}) \\
&= \mathbf{v}_\perp \cos \alpha + (\mathbf{u} \times \mathbf{v}) \sin\alpha + \mathbf{v}_\|
\end{aligned}
  这里,\mathbf{v}_\perp 表示 \mathbf{v} 相对于 \mathbf{u} 的垂直分量,\mathbf{v}_\| 表示 \mathbf{v} 相对于 \mathbf{u} 的平行分量。
 
2.证明:四元数球面插值 slerp(\mathbf{\hat{q}},\mathbf{\hat{r}},t) 的正确性。
 
3.证明:四元数转换为矩阵。
 
4.证明:任意两个向量之间的转换四元数以及旋转矩阵。
未完待续

About the Author

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注