3DCGと行列

matrixとvectorの積

一次変換 \[ x'=ax+by \\ y'=cx+dy \] を行列で表現すると \[ \begin{pmatrix} x' \\ y' \end{pmatrix}= \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} \] となる。詳しく書くと \[ \begin{pmatrix} x' & any \\ y' & any \end{pmatrix} = \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x & 0 \\ y & 0 \end{pmatrix} = \begin{pmatrix} ax+by & 0 \\ cx+dy & 0 \end{pmatrix} \] こうなる。\(any\)は参照されない。
因みに \[ \begin{pmatrix} x' & y' \end{pmatrix}= \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x & y \end{pmatrix} \] この表現は \[ \begin{pmatrix} x' & y' \\ any & any \end{pmatrix} = \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x & y \\ 0 & 0 \end{pmatrix} = \begin{pmatrix} ax & ay \\ cx & cy \end{pmatrix} \] となり \[ x'=ax \\ y'=ay \] 用をなさない。

matrixと配列

matrixを1次元配列に格納する方法は2通りあるが \[ \begin{pmatrix} v'_0 \\ v'_1 \end{pmatrix} = \begin{pmatrix} m_0 & m_2 \\ m_1 & m_3 \end{pmatrix} \begin{pmatrix} v_0 \\ v_1 \end{pmatrix} \tag{1} \] \[ \begin{pmatrix} v'_0 \\ v'_2 \end{pmatrix} = \begin{pmatrix} m_0 & m_1 \\ m_2 & m_3 \end{pmatrix} \begin{pmatrix} v_0 \\ v_2 \end{pmatrix} \tag{2} \] を見て明らかなように(1)が採用されている。
4x4行列の場合は \[ \begin{pmatrix} m_0 & m_4 & m_8 & m_{12} \\ m_1 & m_5 & m_9 & m_{13} \\ m_2 & m_6 & m_{10} & m_{14} \\ m_3 & m_7 & m_{11} & m_{15} \end{pmatrix} \] となる。

matrix同士の積

\[ \begin{pmatrix} m'_0 & m'_2 \\ m'_1 & m'_3 \end{pmatrix} = \begin{pmatrix} m_0 & m_2 \\ m_1 & m_3 \end{pmatrix} \begin{pmatrix} n_0 & n_2 \\ n_1 & n_3 \end{pmatrix} = \begin{pmatrix} m_0n_0+m_2n_1 & m_0n_2+m_2n_3 \\ m_1n_0+m_3n_1 & m_1n_2+m_3n_3 \end{pmatrix} \]

matrixの掛け順

モデル座標を画面座標に変換するにはModel View Projectionの順で変換する \[ pos' = ( pMatrix \times vMatrix \times mMatrix ) \times pos \] の様な式になる。このMVP変換行列は予め計算しておくことが多い。