2020年12月5日土曜日

回転行列の右手系⇔左手系変換方法

ややこしいUnityの座標系の確認方法」シリーズ. 右手系で表された三次元空間中での回転行列を左手系で表すとどうなるのか?混乱してしまうことがあるのでメモ. 他のブログでは,オイラー角限定だったり,特定の角度のみの例であったりして一般性に欠けるものしか見つけられなったので自分で考えてみた.

左手系の座標を右手系の座標で表す

左手/右手系の座標をそれぞれ$[x_l,y_l,z_l]^T$,$[x_r,y_r,z_r]^T$とする. $x,y,z$の何れかを要素の符号を奇数回反転させると右手系から左手系,左手系から右手系に変換される. ここでは$z$の成分のみ1回符号を反転させることで右手系から左手系への変換を表現する.

\begin{equation} \left[ \begin{array}{c} x_l\\ y_l\\ z_l \end{array} \right] = \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{array} \right] \left[ \begin{array}{c} x_r\\ y_r\\ z_r \end{array} \right] = \left[ \begin{array}{c} x_r\\ y_r\\ -z_r \end{array} \right] \end{equation}

このように1と0と-1からなる行列で表すことができる. 逆変換にしても行列は変わらない.

\begin{equation} \left[ \begin{array}{c} x_r\\ y_r\\ z_r \end{array} \right] = \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{array} \right] \left[ \begin{array}{c} x_l\\ y_l\\ z_l \end{array} \right] = \left[ \begin{array}{c} x_l\\ y_l\\ -z_l \end{array} \right] \end{equation}

右手系での回転行列を左手系の座標で表す

右手座標系の座標$[x_r,y_r,z_r]$で表される点があり,回転された別の右手座標系では$[x'_r,y'_r,z'_r]$で表されるとすると,両座標の関係はこのようになる.

\begin{equation} \left[ \begin{array}{c} x_r'\\ y_r'\\ z_r' \end{array} \right] = \left[ \begin{array}{ccc} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \\ \end{array} \right] \left[ \begin{array}{c} x_r\\ y_r\\ z_r \end{array} \right] \end{equation}

同じ点が左手座標系では,$[x_l,y_l,z_l]^T$から$[x'_l,y'_l,z'_l]^T$に同一の回転により変換されるとすると, $[x'_r,y'_r,z'_r]^T$と$[x'_l,y'_l,z'_l]^T$も同一点の右手座標系と左手座標系の関係にある. 上式に,最初の左手系での座標の式を使って左手系の座標のみで表すと左手系での回転行列が得られる. 式(3)に式(2)を代入すると..

\[ \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{array} \right] \left[ \begin{array}{c} x'_l\\ y'_l\\ z'_l \end{array} \right] = \left[ \begin{array}{ccc} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \\ \end{array} \right] \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{array} \right] \left[ \begin{array}{c} x_l\\ y_l\\ z_l \end{array} \right] \]

左辺の行列の逆行列を両辺にかけると行列を移項できる.

\[ \left[ \begin{array}{c} x'_l\\ y'_l\\ z'_l \end{array} \right] = \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{array} \right] \left[ \begin{array}{ccc} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \\ \end{array} \right] \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{array} \right] \left[ \begin{array}{c} x_l\\ y_l\\ z_l \end{array} \right] \]

左側の行列と真ん中の行列を掛け算する.

\[ \left[ \begin{array}{c} x'_l\\ y'_l\\ z'_l \end{array} \right] = \left[ \begin{array}{ccc} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ -r_{31} & -r_{32} & -r_{33} \\ \end{array} \right] \left[ \begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{array} \right] \left[ \begin{array}{c} x_l\\ y_l\\ z_l \end{array} \right] \]

今度は右側の行列と左の行列を掛け算する.

\[ \left[ \begin{array}{c} x'_l\\ y'_l\\ z'_l \end{array} \right] = \left[ \begin{array}{ccc} r_{11} & r_{12} & -r_{13} \\ r_{21} & r_{22} & -r_{23} \\ -r_{31} & -r_{32} & r_{33} \\ \end{array} \right] \left[ \begin{array}{c} x_l\\ y_l\\ z_l \end{array} \right] \]

できました.左手系の座標から左手系の座標への回転になっています. この式を見てもらったら分かる通り,オイラー角に限った話でもないし,そもそも回転行列に限った話でもない. 今回は$z$だけを符号反転させることにしたけど,他の要素を反転した場合は結果は変わるので, 同じ右手系でもx軸が右,y軸が下,z軸が前の右手系と,x軸が右,y軸が上,z軸が後の右手系では結果は違う.