罗德里格斯旋转公式及其推导
罗德里格斯(Rodrigues)旋转公式及其推导
三维空间旋转矩阵
计算机图形学中,三维空间下绕不同坐标轴的旋转矩阵如下(右手系逆时针):
绕X轴旋转: R x = [ 1 0 0 0 c o s θ − sin θ 0 s i n θ cos θ ] (1) R_x = \left[ \begin{matrix} \ 1 & 0 & 0 \\ \ 0 &cos \theta & -\sin \theta \\ \ 0 &sin \theta& \cos \theta \end{matrix} \right] \tag{1} Rx=⎣⎡ 1 0 00cosθsinθ0−sinθcosθ⎦⎤(1)
绕Y轴旋转: R y = [ cos θ 0 sin θ 0 1 0 − sin θ 0 cos θ ] (2) R_y= \left[ \begin{matrix} \cos \theta & 0 & \sin \theta \\ \ 0 & 1 & 0 \\ -\sin \theta & 0 & \cos \theta \end{matrix} \right] \tag{2} Ry=⎣⎡cosθ 0−sinθ010sinθ0cosθ⎦⎤(2)
绕Z轴旋转: R z = [ c o s θ − sin θ 0 s i n θ cos θ 0 0 0 1 ] (3) R_z = \left[ \begin{matrix} \ cos \theta & -\sin \theta & 0 \\ \ sin \theta& \cos \theta & 0 \\ 0 & 0 & 1 \end{matrix} \right] \tag{3} Rz=⎣⎡ cosθ sinθ0−sinθcosθ0001⎦⎤(3)
可以看到,这三个旋转矩阵,只有在三维空间下物体围绕某一特定坐标轴旋转的特殊情况下才能使用。从几何角度来讲,三维空间中任意一个旋转(绕任意轴),都可以分解为绕X轴,Y轴,Z轴旋转的复合。即对于任意旋转轴 n ⃗ \vec{n} n,旋转角 θ \theta θ: R ( n ⃗ , θ ) = R ( x ⃗ , θ x ) ∗ R ( y ⃗ , θ y ) ∗ R ( z ⃗ , θ z ) . (4) R(\vec{n},\theta) = R(\vec{x},\theta x) * R(\vec{y},\theta y) * R(\vec{z},\theta z)\,.\tag{4} R(n,θ)=R(x,θx)∗R(y,θy)∗R(z,θz).(4)
然而,这样分解与矩阵运算的计算量显然是十分大的。
罗德里格斯旋转方程(Rodrigues)
罗德里格斯旋转公式,用于表示空间中任一向量 v ⃗ \vec{v} v,沿任一旋转轴 k ⃗ \vec{k} k, 旋转任一角度 θ \theta θ后,得到的结果: v ⃗ r o t = v ⃗ cos θ + ( 1 − cos θ ) ( k ⃗ ⋅ v ⃗ ) ⋅ k ⃗ + sin θ ∗ k ⃗ × v ⃗ (5) \vec{v}_{rot} = \vec{v} \cos\theta + (1-\cos\theta)(\vec{k} \cdot\ \vec{v})\cdot \vec{k} + \sin\theta *\vec{k} \times \vec{v} \tag{5} vrot=vcosθ+(1−cosθ)(k⋅ v)⋅k+sinθ∗k×v(5)
这个式子还不是很直观,所以需要引入另外两个公式来再推导两步化简:
叉积矩阵
~~~~~~~ 关于 a ⃗ × b ⃗ \vec{a} \times \vec{b} a×b ,有: ( x a y a z a ) × ( x b y b z b ) = ( y a z b − z a y b z a x b − x a z b x a y b − y a x b ) (6) \begin{pmatrix} x_a \\y_a \\ z_a \end{pmatrix} \times \begin{pmatrix} x_b \\y_b \\ z_b \end{pmatrix}= \begin{pmatrix} y_az_b - z_ay_b \\z_ax_b - x_az_b \\ x_ay_b -y_ax_b \end{pmatrix}\tag{6} ⎝⎛xayaza⎠⎞×⎝⎛xbybzb⎠⎞=⎝⎛yazb−zaybzaxb−xazbxayb−yaxb⎠⎞(6)
~~~~~~~ 可以写成矩阵形式: ( y a z b − z a y b z a x b − x a z b x a y b − y a x b ) = ( 0 − z a y a z a 0 − x a − y a x a 0 ) ⋅ ( x b y b z b ) (7) \begin{pmatrix} y_az_b - z_ay_b \\z_ax_b - x_az_b \\ x_ay_b -y_ax_b \end{pmatrix} = \begin{pmatrix} 0&-z_a & y_a \\z_a &0&-x_a \\ -y_a &x_a &0 \end{pmatrix} \cdot \begin{pmatrix} x_b \\y_b \\ z_b \end{pmatrix}\tag{7} ⎝⎛yaz