cguser

计算机图形学应用 | 张盼的博客

0%

罗德里格公式推导及理解

在计算机图形学里,我们时常有这种需求,求一个向量绕任意轴旋转 θ\theta 后的向量是多少。我们可以使用罗德里格公式解得。

罗德里格公式:

vrot=cosθv+(1cosθ)(vk)k+sinθk×vv_{rot}=\cos\theta v+(1-\cos\theta)(v \cdot k)k+\sin\theta k \times v

其中,θ\theta 为旋转角度,vv为待旋转向量,kk为旋转轴(单位向量),vrotv_{rot}为旋转后的向量。

推导:

先看图,vv为待旋转向量,kk为旋转轴,vv_{\parallel} 为与kk平行的vv分量,vv_{\perp}为与kk垂直的vv分量,vv_{\parallel}vv_{\perp}vvkk在同一平面上(由vvkk确定的平面),ww是该平面的法向量。vrotv_{rot}是旋转后的向量。

由以上可知,

{v=v+vv=(vk)kv=vv=v(vk)kw=k×vvrot=cosθv+sinθw\begin{cases} v=v_{\perp}+v_{\parallel}\\ v_{\parallel}=(v\cdot k)k \end{cases}\rArr v_{\perp}=v-v_{\parallel}=v-(v\cdot k)k\\ w=k \times v\\ \color{red} v_{rot\perp}=\cos\theta v_{\perp}+\sin\theta w

敲黑板(划重点):vrotv_{rot\perp}vrotv_{rot}vv_{\perp}ww构成的平面上的分量,cosθv\cos\theta v_{\perp}vrotv_{rot\perp}vv_{\perp}上的分量(为叙述方便记为 a),sinθw\sin\theta wvrotv_{rot\perp}ww上的分量(记为 b),a 很好理解,b 可以这样看:vrotv_{rot\perp}的模等于vv_{\perp}的模等于ww的模,相信有些人疑问为什么等于ww的模?

因为

k×v=wkvsinπ2=wv=wk\times v_{\perp}=w\\ \lvert k\rvert\cdot \lvert v_{\perp}\rvert\cdot\sin\frac\pi 2=\lvert w\rvert\\ \lvert v_{\perp}\rvert=\lvert w\rvert

所以

b=sinθvrotb=sinθw\lvert b\rvert=\sin\theta\lvert v_{rot\perp}\rvert\\ \lvert b\rvert=\sin\theta\lvert w\rvert

b=bwwb=\lvert b\rvert\cdot\frac w{\lvert w\rvert}

b=sinθwww=sinθwb=\sin\theta\lvert w\rvert\cdot\frac w{\lvert w\rvert}=\sin\theta w

综上所述,我们可知

vrot=v+vrotvrot=(vk)k+cosθv+sinθwvrot=(vk)k+cosθ(v(vk)k)+sinθk×vv_{rot}=v_{\parallel}+v_{rot\perp}\\ \dArr\\ v_{rot}=(v\cdot k)k+\cos\theta v_{\perp}+\sin\theta w\\ \dArr\\ v_{rot}=(v\cdot k)k+\cos\theta (v-(v\cdot k)k)+\sin\theta k\times v

化简

vrot=cosθv+(1cosθ)(vk)k+sinθk×vv_{rot}=\cos\theta v+(1-\cos\theta)(v\cdot k)k+\sin\theta k\times v

上述是第一种公式,还有第二种公式,不过换汤不换药,只是将vv_{\perp}用叉乘来表示,即v=k×(k×v)v_{\perp}=-k\times (k\times v),感兴趣的朋友可以自行推导一番,结果为

v+(1cosθ)k×(k×v)+sinθk×vv+(1-\cos\theta)k\times(k\times v)+\sin\theta k\times v