機械学習基礎理論独習

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

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

2つのベクトルを一致させる回転を表す変換を求める

はじめに

2つのベクトルを一致させる座標変換をクォータニオンを使って作る という記事を読んでまして、良い記事だなって思ったので自分用にまとめておきます。
アプリなら、入力者がマウスクリックで指定した三角形の法線方向をビュー座標系のz+にする場合などに使えるかなって思います。

導出

移動元のベクトルを {\bf x}\in{\mathbb R}^3、移動先のベクトルを {\bf y}\in{\mathbb R}^3 とします。
ただし、||{\bf x}||=||{\bf y}|| とします。原点周りの回転を考えるのだから、当然の仮定だと思います。
{\bf x}{\bf y} に一致させる任意軸回りの回転による変換を求めてみます。

まず、角度を求めます。
{\bf x},{\bf y} のなす角度を \theta とすると、

\begin{eqnarray}
&&\cos\theta=\dfrac{{\bf x}^\top{\bf y}}{||{\bf x}||\cdot||{\bf y}||}\tag{1}\\
&&\theta=\arccos\left(\dfrac{{\bf x}^\top{\bf y}}{||{\bf x}||\cdot||{\bf y}||}\right)\tag{2}
\end{eqnarray}
と求まります。

次に、回転する軸のベクトル {\bf a}\in{\mathbb R}^3 を求めます。

\begin{eqnarray}
{\bf a}=\dfrac{{\bf x}\times{\bf y}}{||{\bf x}\times{\bf y}||}\tag{3}
\end{eqnarray}

(2),(3) より、回転軸と回転角度が求まったので、あとはこれを単位四元数にするなり、回転行列にすれば、{\bf x}{\bf y} に一致させることができます。
このときの回転を表す単位四元数 {\bf q}=\left(\cos\dfrac{\theta}{2},\sin\dfrac{\theta}{2}{\bf a}\right)\in{\mathbb H} であり、{\bf q} を使って {\bf x},{\bf y} を表すと以下のようになります。

\begin{eqnarray}
(0,{\bf y})={\bf q}(0,{\bf x}){\bf q}^{-1}\tag{4}
\end{eqnarray}
(4)四元数の演算ですので、{\bf x},{\bf y}\in{\mathbb R}^3(0,{\bf x}),(0,{\bf y})\in{\mathbb H} と書いています。

また、このときの回転行列 {\bf R}\in{\mathbb R}^3 は以下のようになります。

\begin{eqnarray}
{\bf R}=
\begin{pmatrix}
\cos\dfrac{\theta}{2}+a_x^2\left(1-\cos\dfrac{\theta}{2}\right) & a_xa_y\left(1-\cos\dfrac{\theta}{2}\right)-a_z\sin\dfrac{\theta}{2} & a_xa_z\left(1-\cos\dfrac{\theta}{2}\right)+a_y\sin\dfrac{\theta}{2}\\
a_xa_y\left(1-\cos\dfrac{\theta}{2}\right)+a_z\sin\dfrac{\theta}{2} & \cos\dfrac{\theta}{2}+a_y^2\left(1-\cos\dfrac{\theta}{2}\right) & a_ya_z\left(1-\cos\dfrac{\theta}{2}\right)-a_x\sin\dfrac{\theta}{2}\\
a_xa_z\left(1-\cos\dfrac{\theta}{2}\right)-a_y\sin\dfrac{\theta}{2} & a_ya_z\left(1-\cos\dfrac{\theta}{2}\right)+a_x\sin\dfrac{\theta}{2} & \cos\dfrac{\theta}{2}+a_z^2\left(1-\cos\dfrac{\theta}{2}\right)
\end{pmatrix}\tag{5}
\end{eqnarray}
{\bf R} を使って {\bf x},{\bf y} を表すと以下のようになります。
\begin{eqnarray}
{\bf y}={\bf R}{\bf x}\tag{6}
\end{eqnarray}

(4),(6) のお好きな方法で、ベクトルを変換してください。

 ||{\bf x}||\not=||{\bf y}|| の場合どうなるか

 ||{\bf x}||\not=||{\bf y}|| の場合でも、\theta,{\bf a} は同じものが求まります。
このとき、{\bf y}'={\bf R}{\bf x} とすると、{\bf y}'=\dfrac{||{\bf x}||}{||{\ bf y}||}{\bf y} となります。

最後に

単位四元数を回転した後の回転姿勢と思っていると、この発想はしにくいかなって思いますね。
発想的には、この変換は回転である⇒任意軸の回転である⇒任軸の回転は単位四元数を使って表せる って感じですかね。
これを実装したプログラムは公開したいなと思っています。

目次へ戻る