読者です 読者をやめる 読者になる 読者になる

オイラー角と回転行列

3次元 数学

こんにちは、株式会社CFlatです。

とあるお客さんからオイラー角の質問を受けたので少し調べてみました。
その際に計算結果は色んなサイトに載っていましたが、計算過程が見つからなかったのでメモしておきます。

オイラー角とは

オイラー角とは3次元空間にあるオブジェクトの姿勢を表現する手法で、回転軸も回転毎に変化します。

具体的にx-y-z系のオイラー角の回転方法を説明します。
以下、絶対座標系を大文字のXYZ、オブジェクトの座標系を小文字のxyzで表現します。

( x, y, z )をx軸周りに角度αだけ回転して( x', y', z' )とする。
( x', y', z' )をy'軸周りに角度βだけ回転して( x'', y'', z'' )とする。
( x'', y'', z'' )をz''軸周りに角度γだけ回転して( x''', y''', z''' )とする。
このように( x, y, z )を( x''', y''', z''' )に回転させたとき、α、β、γをx-y-z系のオイラー角と言います。

オイラー角と回転行列の関係

次にオイラー角と回転行列の関係を計算します。
P軸周りに角度θだけ回転させる行列をR_P(\theta)とし
初期状態でXYZとxyzが一致しているとすると
x-y-z系のオイラー角を表す回転行列Rは

R = R_X(\alpha)R_Y(\beta)R_Z(\gamma)

であると色んなサイトに書かれています。つまり次の式が成り立っています。

R = R_{z''}(\gamma)R_{y'}(\beta)R_x(\alpha) = R_X(\alpha)R_Y(\beta)R_Z(\gamma)

オブジェクト座標系でx, y', z''の順番に回転していたはずが、
絶対座標系でZ, Y, Xの順番での回転に一致するという一見不思議な状態になります。


ここから不思議な状態の解説をしていきますが、
その前に基本をおさらいしておきます。

絶対座標X, Y, Z軸周りの回転はそれぞれ下記のように書けます。

R_X = \left(\begin{array}{ccc} 1 & 0 & 0 \\ 0 & cos\theta & -sin\theta \\ 0 & sin\theta & cos\theta \\ \end{array} \right), R_Y = \left(\begin{array}{ccc} cos\theta & 0 & sin\theta \\ 0 & 1 & 0 \\ -sin\theta & 0 & cos\theta \\ \end{array} \right), R_Z = \left(\begin{array}{ccc} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \\ \end{array} \right)

では任意のP軸周りの回転の場合はというと、絶対座標軸よりもちょっと面倒な作業をしなければなりません。
1つの手法として、まずP軸をX軸に合わせるような回転行列R'を掛けて、P軸とX軸を一致させます。
次に絶対座標X軸周りの回転R_Xを行い、最後に逆行列R'^{-1}を掛けてPを元の位置に戻します。

式で書くと次のようになります。

R_P(\theta) = R'^{-1}R_X(\theta)R'


任意軸周りの回転が表現できたところで最初のx-y-z系のオイラー角を表す回転行列Rを変形していきます。初期状態は

R = R_{z''}(\gamma)R_{y'}(\beta)R_x(\alpha)

初期状態で絶対座標のXとオブジェクト座標のxは一致しているので、

R = R_{z''}(\gamma)R_{y'}(\beta)R_X(\alpha)

y'軸周りの回転をするためにy'をYに合わせてから元に戻します。

\begin{eqnarray}R & = & R_{z''}(\gamma)R_X(\alpha)R_Y(\beta){R_X(\alpha)}^{-1}R_X(\alpha) \\ & = & R_{z''}(\gamma)R_X(\alpha)R_Y(\beta) \end{eqnarray}

Z''軸周りの回転をするためにz''をZに合わせてから元に戻します。

\begin{eqnarray}R & = & R_X(\alpha)R_Y(\beta)R_Z(\gamma){R_Y(\beta)}^{-1}{R_X(\alpha)}^{-1}R_X(\alpha)R_Y(\beta) \\ & = & R_X(\alpha)R_Y(\beta)R_Z(\gamma) \end{eqnarray}

めでたくオブジェクト軸周りx, y', z''順の回転が
絶対座標軸周りZ, Y, X順の回転に変形できました。

確認

実際にオブジェクトを回転させて確かめてみます。

以下では左側が絶対座標系(細い座標軸)でZ(青), Y(緑), X(赤)の順に回転し、
右側がオブジェクト座標系(太い座標軸)でx(赤), y'(緑), z''(青)の順に回転した様子です。

初期状態です。

左はZ軸、右はx軸周りにそれぞれ90°回転させます。

左はY軸、右はy'軸周りにそれぞれ90°回転させます。

左はX軸、右はz''軸周りにそれぞれ90°回転させます。

オブジェクト軸周りx, y', z''順の回転が
絶対座標軸周りZ, Y, X順に等しいことが分かります。

実例で学ぶゲーム3D数学

実例で学ぶゲーム3D数学