機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

任意軸まわりの回転 - ロドリゲスの回転公式

任意軸まわりの回転

単位ベクトル \bf a まわりに点 P (位置ベクトル\bf p)を \theta 回転した点を P' (位置ベクトル {\bf p}') とすると、以下のようになります。

\begin{eqnarray}
{\bf p}'={\bf p}+\sin\theta\left({\bf a}\times{\bf p}\right)+(1-\cos\theta){\bf a}\times({\bf a}\times{\bf p})\tag{1}
\end{eqnarray}
(1) はロドリゲスの回転公式と言います。

任意軸まわりの回転の導出

(1) を導出します。

下図を参考にして、{\bf p}'_\perp を分解します。

\begin{eqnarray}
{\bf p}'_\perp=||{\bf p}'_\perp||\cos\theta\dfrac{{\bf p}_\perp}{||{\bf p}_\perp||}+||{\bf p}'_\perp||\sin\theta\dfrac{{\bf a}\times{\bf p}_\perp}{||{\bf a}\times{\bf p}_\perp||}\tag{2}
\end{eqnarray}

{\bf p}_\perp,{\bf p}'_\perp は同一円上にあるので、||{\bf p}_\perp||=||{\bf p}'_\perp||\ \cdots(3) が成り立ちます。
||{\bf a}||=1,{\bf a}\perp{\bf p\perp} より、||{\bf a}\times{\bf p}_\perp||=||{\bf a}||\cdot||{\bf p}_\perp||\sin\dfrac{\pi}{2}=||{\bf p}_\perp||=||{\bf p}'_\perp||\ \cdots(4) が成り立ちます。

(3),(4)(2) に代入して整理します。

\begin{eqnarray}
{\bf p}'_{||}=\cos\theta{\bf p}_\perp+\sin\theta\left({\bf a}\times{\bf p}_\perp\right)\tag{5}
\end{eqnarray}

{\bf p}_{||}={\bf p}'_{||} であり、{\bf p'}={\bf p}'_{||}+{\bf p}'_\perp であるので、(5) と合わせて以下が成り立ちます。

\begin{eqnarray}
{\bf p'}&=&{\bf p}_{||}+\cos\theta{\bf p}_\perp+\sin\theta\left({\bf a}\times{\bf p}_\perp\right)\\
&=&\left({\bf p}-{\bf p}_\perp\right)+\cos\theta{\bf p}_\perp+\sin\theta\left({\bf a}\times{\bf p}_\perp\right)\tag{6}
\end{eqnarray}

あとは、(6){\bf a}{\bf p} で表せばよいです。

{\bf a}\perp{\bf p}_\perp かつ ||{\bf a}||=1 なので、||{\bf a}\times{\bf p}_\perp||=||{\bf a}||\cdot||{\bf p}_\perp||=||{\bf p}_\perp|| が成り立ちます。
また、\left({\bf a}\times{\bf p}\right)\perp{\bf a} なので、 ||\left({\bf a}\times{\bf p}_\perp\right)\times{\bf a}||=||{\bf a}\times{\bf p}||\cdot||{\bf a}||=||{\bf p}_\perp|| が成り立ちます。
以上より、{\bf p}_\perp は以下のように書けます。

\begin{eqnarray}
{\bf p}_\perp=-{\bf a}\times\left({\bf a}\times{\bf p}_\perp\right)\tag{7}
\end{eqnarray}

一方、{\bf p}={\bf p}_{||}+{\bf p}_\perp であるので、{\bf a}外積を取ります。

\begin{eqnarray}
{\bf a}\times{\bf p}&=&{\bf a}\times{\bf p}_{||}+{\bf a}\times{\bf p}_\perp\\
&=&{\bf a}\times{\bf p}_\perp\tag{8}
\end{eqnarray}
(8) の導出で、{\bf a}\times{\bf p}_{||}={\bf 0} であることを用いました。

(8)(7) に代入します。

\begin{eqnarray}
{\bf p}_\perp=-{\bf a}\times\left({\bf a}\times{\bf p}\right)\tag{9}
\end{eqnarray}

(6),(8),(9) より、

\begin{eqnarray}
{\bf p}'&=&\left({\bf p}-\left(-{\bf a}\times\left({\bf a}\times{\bf p}\right)\right)\right)+\cos\theta\left(-{\bf a}\times\left({\bf a}\times{\bf p}\right)\right)+\sin\theta\left({\bf a}\times{\bf p}\right)\\
&=&{\bf p}+\sin\theta\left({\bf a}\times{\bf p}\right)+(1-\cos\theta){\bf a}\times({\bf a}\times{\bf p})\tag{10}
\end{eqnarray}
となり、(1) が成り立つことが示せました。

任意軸まわりの回転行列

求めた (10) を行列で表したいと思います。
まず、ベクトル3重積の公式 (14) を用いて式変形します。

\begin{eqnarray}
{\bf p}'&=&{\bf p}+\sin\theta\left({\bf a}\times{\bf p}\right)+(1-\cos\theta){\bf a}\times({\bf a}\times{\bf p})\\
&=&{\bf p}+\sin\theta\left({\bf a}\times{\bf p}\right)+(1-\cos\theta)\left(\left({\bf a}^\top{\bf p}\right){\bf a}-\left({\bf a}^\top{\bf a}\right){\bf p}\right)\\
&=&{\bf p}+\sin\theta\left({\bf a}\times{\bf p}\right)+(1-\cos\theta)\left(\left({\bf a}^\top{\bf p}\right){\bf a}-{\bf p}\right)\\
&=&\cos\theta{\bf p}+\sin\theta\left({\bf a}\times{\bf p}\right)+(1-\cos\theta)\left({\bf a}^\top{\bf p}\right){\bf a}\tag{11}\\
\end{eqnarray}

次に、{\bf a}\times{\bf p}\left({\bf a}^\top{\bf p}\right){\bf a}(15),(16) を用いて、同等の行列で置き換えます。

\begin{eqnarray}
{\bf p}'&=&
\begin{pmatrix}
1 & 0 & 0\\
0 & 1 & 0\\
0 & 0 & 1
\end{pmatrix}
{\bf p}\cos\theta
 +
\begin{pmatrix}
0 & -a_z & a_y\\
a_z & 0 & -a_x\\
 -a_y & a_x & 0
\end{pmatrix}
{\bf p}\sin\theta
 +
\begin{pmatrix}
a_x^2 & a_xa_y & a_xa_z\\
a_xa_y & a_y^2 & a_ya_z\\
a_xa_z & a_ya_z & a_z^2
\end{pmatrix}
{\bf p}(1-\cos\theta)\\
&=&\begin{pmatrix}
\cos\theta+a_x^2(1-\cos\theta) & a_xa_y(1-\cos\theta)-a_z\sin\theta & a_xa_z(1-\cos\theta)+a_y\sin\theta\\
a_xa_y(1-\cos\theta)+a_z\sin\theta & \cos\theta+a_y^2(1-\cos\theta) & a_ya_z(1-\cos\theta)-a_x\sin\theta\\
a_xa_z(1-\cos\theta)-a_y\sin\theta & a_ya_z(1-\cos\theta)+a_x\sin\theta & \cos\theta+a_z^2(1-\cos\theta)
\end{pmatrix}
{\bf p}\tag{12}
\end{eqnarray}

以上より、任意軸まわりの回転行列 {\bf R}_{\bf a}(\theta) が求まりました。

\begin{eqnarray}
{\bf R}_{\bf a}(\theta)=
\begin{pmatrix}
\cos\theta+a_x^2(1-\cos\theta) & a_xa_y(1-\cos\theta)-a_z\sin\theta & a_xa_z(1-\cos\theta)+a_y\sin\theta\\
a_xa_y(1-\cos\theta)+a_z\sin\theta & \cos\theta+a_y^2(1-\cos\theta) & a_ya_z(1-\cos\theta)-a_x\sin\theta\\
a_xa_z(1-\cos\theta)-a_y\sin\theta & a_ya_z(1-\cos\theta)+a_x\sin\theta & \cos\theta+a_z^2(1-\cos\theta)
\end{pmatrix}\tag{13}
\end{eqnarray}

ベクトル3重積の公式

\begin{eqnarray}
{\bf a}\times({\bf b}\times{\bf c})=({\bf a}^\top{\bf c}){\bf b}-({\bf a}^\top{\bf b}){\bf c}\tag{14}
\end{eqnarray}

p の q 上への射影を表す行列

\begin{eqnarray}
{\rm proj}_{\bf q}{\bf p}=\dfrac{{\bf p}^\top{\bf q}}{||{\bf q}||^2}{\bf q}
=
\dfrac{1}{||{\bf q}||^2}
\begin{pmatrix}
q_x^2 & q_xq_y & q_xq_z\\
q_xq_y & q_y^2 & q_yq_z\\
q_xq_z & q_yq_z & q_z^2
\end{pmatrix}
\begin{pmatrix}
p_x\\p_y\\p_z\tag{15}
\end{pmatrix}
\end{eqnarray}

外積を表す行列

\begin{eqnarray}
{\bf p}\times{\bf q}=\begin{pmatrix}
0 & -p_z & p_y\\
p_z & 0 & -p_x\\
 -p_y & p_x & 0
\end{pmatrix}
\begin{pmatrix}
q_x\\q_y\\q_z\tag{16}
\end{pmatrix}
\end{eqnarray}

参考文献

3Dグラフィックスのための数学入門 p117-p122
ゲームプログラミングのための3Dグラフィックス数学 p9-p10,p60-p62

目次へ戻る