行列から変換後の座標軸の向きを取得する方法と理屈

3次元空間の変形を表現する4x4行列から、変換後の空間の座標軸の向きを直接取得する方法を説明します。なぜそれで取得できるのか理屈も書いています。

行列の座標軸の向きを取得する

結果は各軸の向きを表す方向ベクトルです。単位ベクトルになるとは限らないので必要に応じて正規化します。

行優先の場合:

行列 (M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44)\begin{pmatrix} \color{red} M_{11} & \color{red} M_{12} & \color{red} M_{13} & M_{14} \\ \color{green}M_{21} & \color{green}M_{22} & \color{green}M_{23} & M_{24} \\ \color{blue} M_{31} & \color{blue} M_{32} & \color{blue} M_{33} & M_{34} \\ M_{41} & M_{42} & M_{43} & M_{44} \end{pmatrix} の座標軸の向きは X=(M11M12M13)Y=(M21M22M23)Z=(M31M32M33)\begin{array}{rl} \color{red} X軸 = & \color{red} \begin{pmatrix}M_{11} & M_{12} & M_{13} \end{pmatrix} \\ \color{green}Y軸 = & \color{green}\begin{pmatrix}M_{21} & M_{22} & M_{23} \end{pmatrix} \\ \color{blue} Z軸 = & \color{blue} \begin{pmatrix}M_{31} & M_{32} & M_{33} \end{pmatrix} \\ \end{array} です。

列優先の場合:

行列 (M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44)\begin{pmatrix} \color{red}M_{11} & \color{green}M_{12} & \color{blue}M_{13} & M_{14} \\ \color{red}M_{21} & \color{green}M_{22} & \color{blue}M_{23} & M_{24} \\ \color{red}M_{31} & \color{green}M_{32} & \color{blue}M_{33} & M_{34} \\ M_{41} & M_{42} & M_{43} & M_{44} \end{pmatrix} の座標軸の向きは X=(M11M21M31)Y=(M12M22M32)Z=(M13M23M33)\\ \color{red} X軸 = \begin{pmatrix} M_{11} \\ M_{21} \\ M_{31} \end{pmatrix} \color{green}Y軸 = \begin{pmatrix} M_{12} \\ M_{22} \\ M_{32} \end{pmatrix} \color{blue} Z軸 = \begin{pmatrix} M_{13} \\ M_{23} \\ M_{33} \end{pmatrix} です。

理屈

例として、X軸の方向を求めたい場合、実際に元のX軸の方向を表すベクトル(1,0,0)を変換してみればいいので、

(M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44)(1000)=(M11M21M31M41)\begin{pmatrix} M_{11} & M_{12} & M_{13} & M_{14} \\ M_{21} & M_{22} & M_{23} & M_{24} \\ M_{31} & M_{32} & M_{33} & M_{34} \\ M_{41} & M_{42} & M_{43} & M_{44} \end{pmatrix} \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix} = \begin{pmatrix} M_{11} \\ M_{21} \\ M_{31} \\ M_{41} \end{pmatrix}

となり、行列の第1列(X軸)、同様に第2列(Y軸)、第3列(Z軸)を取り出したのと同じ結果になります。

さらに、ここでは軸の方向にのみ着目しているので、ww要素(M41M_{41})は無視でき、M11M_{11}, M21M_{21}, M31M_{31} を参照すればいいことが分かります。