文章目录
在看PhysX源码的时候,看到四元数公式,想知道怎么推导过来的,因为网上一大片帖子都是直接写上这个公式。最主要是纠结公式中角度的一半是如何来的
公式
参考[2] 10.4.3
q = [ c o s ( θ / 2 ) , s i n ( θ / 2 ) n ⃗ ] = [ c o s ( θ / 2 ) , s i n ( θ / 2 ) n x , s i n ( θ / 2 ) n y , s i n ( θ / 2 ) n z ] \begin{aligned} q & = [cos(\theta/2), sin(\theta/2)\vec{n}] \\ & = [cos(\theta/2), sin(\theta/2)n_x , sin(\theta/2)n_y, sin(\theta/2)n_z] \end{aligned} q=[cos(θ/2),sin(θ/2)n]=[cos(θ/2),sin(θ/2)nx,sin(θ/2)ny,sin(θ/2)nz]
推导
参考[6]直接给出了证明,下面自己推导一遍
三维空间旋转公式
先抛开四元数,我们去求一个三位空间向量绕固定轴旋转之后的向量的公式是什么?也就是参考[2]书中提到的轴-角式旋转。而四元数是跟轴-角式的旋转相关的,先以这个为基础,再去推导四元数的公式会容易理解一些。
和参考[6]一样,用的右手坐标系,主要是用的绘图软件[9],右手坐标系好看点。
设定:
- 任意向量 v \pmb{v} vvv(向量用粗体小写字母表示)
- 绕经过原点的旋转轴 u = ( x , y , z ) T \pmb{u} = {(x, y, z)}^T uuu=(x,y,z)T
- 右手坐标系,绕向量 p m b u pmb{u} pmbu从箭头到原点方向逆时针旋转角度 θ \theta θ
- u \pmb{u} uuu是单位向量: ∥ u ∥ = x 2 + y 2 + z 2 = 1 \Vert{\pmb{u}}\Vert = \sqrt{x^2 + y ^2 + z^2} = 1 ∥uuu∥=x2+y2+z2=1
为了简单起见,看下图所示

1.向量分解
将 v \pmb{v} vvv分解为平行于 u \pmb{u} uuu的 v ∥ \pmb{v}_{\Vert} vvv∥,和垂直于 u \pmb{u} uuu的 v ⊥ \pmb{v}_{\bot} vvv⊥
v = v ∥ + v ⊥ \pmb{v} = \pmb{v}_{\Vert} + \pmb{v}_{\bot} vvv=vvv∥+vvv⊥
分别旋转这两个分向量,再把最后旋转的两个分量相加,得到旋转后的向量 v ′ \pmb{v}^{'} vvv′
v ′ = v ∥ ′ + v ⊥ ′ \pmb{v}^{'} = {\pmb{v}_{\Vert}}^{'} + {\pmb{v}_{\bot}}^{'} vvv′=vvv∥′+vvv⊥′
如下图所示:

根据正交投影公式
v ∥ = u . v u . u u = ( u . v ) u ( ∥ u ∥ = 1 ) \begin{aligned} \pmb{v}_{\Vert} &= \frac {\pmb{u}.\pmb{v}}{\pmb{u}.\pmb{u}} \pmb{u} \\ &= (\pmb{u}.\pmb{v})\pmb{u} \qquad (\Vert {\pmb u} \Vert = 1) \end{aligned} vvv∥=uuu.uuuuuu.vvvuuu=(uuu.vvv)uuu(∥uuu∥=1)
因为 v = v ∥ + v ⊥ \pmb{v} = \pmb{v}_{\Vert} + \pmb{v}_{\bot} vvv=vvv∥+vvv⊥,所以
v ⊥ = v − v ∥ = v − ( u . v ) u \begin{aligned} \pmb{v}_{\bot} &= \pmb v - \pmb{v}_{\Vert} \\ & = \pmb v - (\pmb{u}.\pmb{v})\pmb{u} \end{aligned} vvv⊥=vvv−vvv∥=vvv−(uuu.vvv)uuu
接下来分别计算~
2.水平方向 v ∥ \pmb{v}_{\Vert} vvv∥的旋转
因为平行向量 v ∥ \pmb{v}_{\Vert} vvv∥绕 u \pmb u uuu旋转任意角度之后还是自身,所以有:
v ∥ ′ = v ∥ {\pmb{v}_{\Vert}}^{'} = \pmb{v}_{\Vert} vvv∥′=vvv∥
3.垂直方向 v ⊥ \pmb{v}_{\bot} vvv⊥的旋转
三维空间如图所示:

用2D的俯视图,会更容易看到清楚,对应于上图的下面一个虚线的圆

借助一个向量 w = u × v ⊥ \pmb w = \pmb u \times {\pmb v_{\bot}} www=uuu×vvv⊥
注意:右手坐标系统,叉乘顺序
∥ w ∥ = ∥ u × v ⊥ ∥ = ∥ u ∥ . ∥ v ⊥ ∥ . s i n ( π / 2 ) = ∥ v ⊥ ∥ \begin{aligned} \Vert \pmb w \Vert & = \Vert \pmb u \times {\pmb v_{\bot}} \Vert \\ &= \Vert u \Vert . \Vert \pmb v_{\bot} \Vert . sin(\pi/2) \\ & = \Vert \pmb v_{\bot} \Vert \end{aligned} ∥www∥=∥uuu×vvv⊥∥=∥u∥.∥vvv⊥∥.sin(π/2)=∥vvv⊥∥
将 v ⊥ ′ \pmb v ^ {'} _ {\bot} vvv⊥′分解到 w \pmb w www和 v ⊥ \pmb v_{\bot} vvv⊥上,可以简单算出来下面的等式
v ⊥ ′ = v v ′ + v w ′ = c o s ( θ ) v ⊥ + s i n ( θ ) w = c o s ( θ ) v ⊥ + s i n ( θ ) ( u × v ⊥ ) \begin{aligned} \pmb v ^ {'} _ {\bot} &= \pmb v^{'}_v + \pmb v^{'}_w \\ & = cos(\theta) \pmb v_\bot + sin(\theta) \pmb w \\ & = cos(\theta) \pmb v_\bot + sin(\theta)(\pmb u \times \pmb v_\bot) \end{aligned} vvv⊥′=vvvv′+vvvw′=cos(θ)vvv⊥+sin(θ)www=cos(θ)vvv⊥+sin(θ)(uuu×vvv⊥)
书上说提到用一点三角学的公式,其实主要是下面的这个三个向量的模都相等。按照投影或者分解,本应该是 v v ′ = c o s ( θ ) v ⊥ ′ \pmb v^{'}_v = cos(\theta) \pmb v^{'}_\bot vvvv

本文深入探讨了三维空间中向量绕轴旋转的数学原理,从向量分解出发,逐步推导出四元数表示下的旋转公式,揭示了四元数与轴角旋转之间的等价性。
最低0.47元/天 解锁文章
1006

被折叠的 条评论
为什么被折叠?



