罗德里格斯公式证明(Games101)

时间: 2023-07-11 admin IT培训

罗德里格斯公式证明(Games101)

罗德里格斯公式证明(Games101)

作业一中的bonus部分是绕任意过原点轴(单位化为向量n)旋转任意角( α \alpha α),这就要用到经典的罗德里格斯公式了:
R ( n , α ) = cos ⁡ α I + ( 1 − cos ⁡ α ) n n T + sin ⁡ α ( 0 − n z n y n z 0 − n x − n y n x 0 ) R(n,\alpha)=\cos\alpha I +(1-\cos\alpha)nn^T+\sin\alpha\begin{pmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \end{pmatrix} R(n,α)=cosαI+(1−cosα)nnT+sinα ​0nz​−ny​​−nz​0nx​​ny​−nx​0​

本文主要根据课程的补充材料来做一下这个公式的证明。


补充材料

材料说明

上面的补充材料就是老师给的证明。值得一提的是,对于本次要旋转的向量s,其中abc并不是三个坐标轴,而是与本次旋转相关的三个轴:a是本次旋转轴方向的单位向量,bc是与a构成两两相互垂直的单位向量(需要满足旋转向量s在Oab平面内)。 θ \theta θ是本次的旋转角。

证明方向

通过将旋转轴方向a分离出来,于是我们只需要旋转s中与a垂直的部分,这部分与b平行,而旋转就在Obc平面内进行。旋转后得到垂直旋转部分 s v R O T s_v^{ROT} svROT​,加上不变的与a平行部分 s p s_p sp​,就可以得到最终旋转后的向量R(a, θ \theta θ) ⋅ \cdot ⋅ s。形式化表示如下:
R ( a , θ ) ⋅ s = s p + s v R O T R(a,\theta)\cdot s = s_p + s_v^{ROT} R(a,θ)⋅s=sp​+svROT​

另外的,根据 R ( a , θ ) ⋅ s R(a,\theta)\cdot s R(a,θ)⋅s,我们拥有的参数只有 a , θ , s a,\theta,s a,θ,s。

证明步骤

这里前三步根据上面的补充材料,第四步为总结。

Step 1: 分解s及获得b

第一步为在Oab平面内分解s,使其分为与旋转轴平行与垂直的两部分,记平行部分为 s p s_p sp​,垂直部分为 s v s_v sv​。则分解形式如下:
s p = a ⋅ ( a ⋅ s ) = a ⋅ ( a T ⋅ s ) = a ⋅ a T ⋅ s s_p=a\cdot(a\cdot s) = a\cdot(a^T\cdot s) = a\cdot a^T\cdot s sp​=a⋅(a⋅s)=a⋅(aT⋅s)=a⋅aT⋅s
s v = s − s p = s − a ⋅ a T ⋅ s s_v=s-s_p=s-a\cdot a^T\cdot s sv​=s−sp​=s−a⋅aT⋅s
b = s v ∣ ∣ s v ∣ ∣ b=\frac{s_v}{||s_v||} b=∣∣sv​∣∣sv​​

Step2: 获得c

第二步为通过ab获得c。该步只需要一次向量叉乘,形式如下:
c = a × b = a × s v ∣ ∣ s v ∣ ∣ = a × ( s − s p ) ∣ ∣ s v ∣ ∣ = a × s ∣ ∣ s v ∣ ∣ c=a\times b=a\times\frac{s_v}{||s_v||}=\frac{a\times (s-s_p)}{||s_v||}=\frac{a\times s}{||s_v||} c=a×b=a×∣∣sv​∣∣sv​​=∣∣sv​∣∣a×(s−sp​)​=∣∣sv​∣∣a×s​

Step3: 获得 s v R O T s_v^{ROT} svROT​

第三步为获得 s v s_v sv​的旋转后形式 s v R O T s_v^{ROT} svROT​。基于旋转长度不变,我们可以将 s v R O T s_v^{ROT} svROT​分为平行于b方向与平行于c方向的两部分,二者相加就可以得到 s v R O T s_v^{ROT} svROT​。形式如下:
s v R O T = ∣ ∣ s v ∣ ∣ ( cos ⁡ θ b + sin ⁡ θ c ) s_v^{ROT}=||s_v||(\cos\theta b+\sin\theta c) svROT​=∣∣sv​∣∣(cosθb+sinθc)

Step4: 整理总结

将 b = s v ∣ ∣ s v ∣ ∣ b=\frac{s_v}{||s_v||} b=∣∣sv​∣∣sv​​、 c = a × s ∣ ∣ s v ∣ ∣ c=\frac{a\times s}{||s_v||} c=∣∣sv​∣∣a×s​、 s v = s − a ⋅ a T ⋅ s s_v=s-a\cdot a^T\cdot s sv​=s−a⋅aT⋅s代入Step3公式可得:
s v R O T = cos ⁡ θ s v + sin ⁡ θ ( a × s ) = cos ⁡ θ s − cos ⁡ θ a ⋅ a T ⋅ s + sin ⁡ θ ( a × s ) s_v^{ROT}=\cos\theta s_v+\sin\theta (a\times s) = \cos\theta s - \cos\theta a\cdot a^T\cdot s +\sin\theta (a\times s) svROT​=cosθsv​+sinθ(a×s)=cosθs−cosθa⋅aT⋅s+sinθ(a×s)
将叉积转化为矩阵乘法得:
s v R O T = cos ⁡ θ s − cos ⁡ θ a ⋅ a T ⋅ s + sin ⁡ θ ( 0 − a z a y a z 0 − a x − a y a x 0 ) ⋅ s s_v^{ROT}=\cos\theta s - \cos\theta a\cdot a^T\cdot s +\sin\theta \begin{pmatrix} 0 & -a_z & a_y \\ a_z & 0 & -a_x \\ -a_y & a_x & 0 \end{pmatrix}\cdot s svROT​=cosθs−cosθa⋅aT⋅s+sinθ ​0az​−ay​​−az​0ax​​ay​−ax​0​ ​⋅s
最后,通过相加平行和垂直分量得到旋转后向量:
R ( a , θ ) ⋅ s = s p + s v R O T = a ⋅ a T ⋅ s + s v R O T R(a,\theta)\cdot s = s_p + s_v^{ROT} = a\cdot a^T\cdot s + s_v^{ROT} R(a,θ)⋅s=sp​+svROT​=a⋅aT⋅s+svROT​
R ( a , θ ) ⋅ s = ( cos ⁡ θ I + ( 1 − cos ⁡ θ ) a a T + sin ⁡ θ ( 0 − a z a y a z 0 − a x − a y a x 0 ) ) ⋅ s R(a,\theta)\cdot s = (\cos\theta I +(1-\cos\theta)aa^T+\sin\theta\begin{pmatrix} 0 & -a_z & a_y \\ a_z & 0 & -a_x \\ -a_y & a_x & 0 \end{pmatrix}) \cdot s R(a,θ)⋅s=(cosθI+(1−cosθ)aaT+sinθ ​0az​−ay​​−az​0ax​​ay​−ax​0​ ​)⋅s
消去s就可以得到:
R ( a , θ ) = cos ⁡ θ I + ( 1 − cos ⁡ θ ) a a T + sin ⁡ θ ( 0 − a z a y a z 0 − a x − a y a x 0 ) R(a,\theta) = \cos\theta I +(1-\cos\theta)aa^T+\sin\theta\begin{pmatrix} 0 & -a_z & a_y \\ a_z & 0 & -a_x \\ -a_y & a_x & 0 \end{pmatrix} R(a,θ)=cosθI+(1−cosθ)aaT+sinθ ​0az​−ay​​−az​0ax​​ay​−ax​0​


证明完毕~