罗德里格斯公式证明(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+(1cosα)nnT+sinα 0nznynz0nxnynx0

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


补充材料

Games101材料

材料说明

上面的补充材料就是老师给的证明。值得一提的是,对于本次要旋转的向量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(as)=a(aTs)=aaTs
s v = s − s p = s − a ⋅ a T ⋅ s s_v=s-s_p=s-a\cdot a^T\cdot s sv=ssp=saaTs
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×(ssp)=∣∣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=saaTs代入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θscosθaaTs+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θscosθaaTs+sinθ 0azayaz0axayax0 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=aaTs+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+(1cosθ)aaT+sinθ 0azayaz0axayax0 )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+(1cosθ)aaT+sinθ 0azayaz0axayax0


证明完毕~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hiroxzwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值