複数の変換の合成は、それらの変換に対応する行列の積によって表される。3D空間における変換は$4\times4$行列によって表され、$4\times4$行列がいくつあってもそれら全ての積は、ただ1つの$4\times4$行列となる。
本節では、3D空間における$4\times4$の変換行列から得られる情報について、やや詳しく見ていく。
なお、この講義において扱う変換は平行移動、回転、スケールの3種類のみである。したがって、「変換」あるいは「変換行列」と書かれてあれば、これら3つのうちのいずれか、またはそれらの合成を指している。
(注意)
変換の合成におけるスケールについては、3-12節、3-13節で述べたように次の取り決めに従うものとする (この取り決めがなければ、以下の議論は成り立たない)。
(1) 非一様スケール(各軸の倍率が異なるスケール)を実行する場合は、変換の合成において一番初めに実行し、それ以降では非一様スケールは実行しないものとする
(2) 倍率が$0$以下のスケール(倍率が$0$あるいはマイナスの値をとるスケール)は実行しない
ただし、一様スケール(各軸の倍率が同じスケール ; 倍率はプラスの値)については、変換の合成における順番はどこでもよく、何度使っても構わない。
A) 変換行列の分解
1つ以上の変換の合成を表す行列を$M$とし、$M$の各成分を$m_{ij}$とする。具体的には以下の通り。
\[M = \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} \\0 &0 &0 &1 \end{pmatrix} \]$M$は1つ以上の変換行列の積であるから、$M$もまた何らかの変換を表す変換行列である (3-12節の終わりで指摘したように、平行移動、回転、スケールの任意回数の合成を表す変換行列は、その第4行目が必ず $(0, 0, 0, 1)$ の形になる)。
まずは、この$M$の各成分を以下の手順で書き換えることから始める。
第1列目、第2列目、第3列目の大きさを$s_x$、$s_y$、$s_z$とする。すなわち、
\begin{align*}\sqrt{m_{11}^2 + m_{21}^2 + m_{31}^2 } = s_x\\\sqrt{m_{12}^2 + m_{22}^2 + m_{32}^2 } = s_y \\\sqrt{m_{13}^2 + m_{23}^2 + m_{33}^2 } = s_z\end{align*}である ($M$は変換行列の積なので、$(m_{11}, m_{21}, m_{31})$、$(m_{12}, m_{22}, m_{32})$、$(m_{13}, m_{23}, m_{33})$ はいずれも $(0, 0, 0)$ ではない。したがって、$s_x,\ s_y,\ s_z > 0$ である)。
さらに、第1列目の各成分を$s_x$で割った値を $r_{i1}$、第2列目の各成分を$s_y$で割った値を $r_{i2}$、第3列目の各成分を$s_z$で割った値を $r_{i3}$とする (ただし $i = 1, 2, 3$)。例えば、第1列目であれば、
\[m_{11} / s_x = r_{11} \qquad m_{21} / s_x = r_{21} \qquad m_{31} / s_x = r_{31}\]である ($s_x$、$s_y$、$s_z$は第1列目、第2列目、第3列目の大きさを表している。したがって、$(r_{11}, r_{21}, r_{31})$、$(r_{12}, r_{22}, r_{32})$、$(r_{13}, r_{23}, r_{33})$は単位ベクトルになることに注意)。
そして、第4列目の成分の名前を以下のように変える。
\[m_{14} = t_x \qquad m_{24} = t_y \qquad m_{34} = t_z\]
この手順によって$M$は、
\[M = \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} \\0 &0 &0 &1 \end{pmatrix} =\begin{pmatrix}s_x r_{11} &s_y r_{12} &s_z r_{13} &t_x \\s_x r_{21} &s_y r_{22} &s_z r_{23} &t_y \\s_x r_{31} &s_y r_{32} &s_z r_{33} &t_z \\0 &0 &0 &1 \end{pmatrix} \qquad (Ex1)\]
と書き換えられる。
では、この簡単な準備を用いて、変換行列に関する重要な命題を示そう。
$M$を$4\times$4の変換行列とすれば、$M$はただ1つの平行移動行列$T$、ただ1つの回転行列$R$、ただ1つのスケール行列$S$に分解され、$M$はこの3つの行列の積として、\[ M = TRS \]として表される。
このことは次のように示される。
変換行列$M$の各成分を先程の手順に従って、以下の形に書き換えたとしよう。
\[M = \begin{pmatrix}s_x r_{11} &s_y r_{12} &s_z r_{13} &t_x \\s_x r_{21} &s_y r_{22} &s_z r_{23} &t_y \\s_x r_{31} &s_y r_{32} &s_z r_{33} &t_z \\0 &0 &0 &1 \end{pmatrix} \]このときの$M$の各成分の値を用いて以下のような平行移動行列$T$、回転行列$R$、スケール行列$S$を作成する。
\[T = \begin{pmatrix}1 &0 &0 &t_x \\0 &1 &0 &t_y \\ 0 &0 &1 &t_z \\0 &0 &0 &1\end{pmatrix} \qquad R = \begin{pmatrix}r_{11} &r_{12} &r_{13} &0 \\r_{21} &r_{22} &r_{23} &0 \\r_{31} &r_{32} &r_{33} &0 \\0 &0 &0 &1 \end{pmatrix} \qquad S = \begin{pmatrix}s_x &0 &0 &0 \\0 &s_y &0 &0 \\ 0 &0 &s_z &0 \\0 &0 &0 &1\end{pmatrix}\]
実際に、この3つの行列の積を上の順序で計算すると、
\begin{align*}TRS &= \begin{pmatrix}1 &0 &0 &t_x \\0 &1 &0 &t_y \\ 0 &0 &1 &t_z \\0 &0 &0 &1\end{pmatrix}\begin{pmatrix}r_{11} &r_{12} &r_{13} &0 \\r_{21} &r_{22} &r_{23} &0 \\r_{31} &r_{32} &r_{33} &0 \\0 &0 &0 &1 \end{pmatrix}\begin{pmatrix}s_x &0 &0 &0 \\0 &s_y &0 &0 \\ 0 &0 &s_z &0 \\0 &0 &0 &1\end{pmatrix} \\\\&=\begin{pmatrix}1 &0 &0 &t_x \\0 &1 &0 &t_y \\ 0 &0 &1 &t_z \\0 &0 &0 &1\end{pmatrix}\begin{pmatrix}s_x r_{11} &s_y r_{12} &s_z r_{13} &0 \\s_x r_{21} &s_y r_{22} &s_z r_{23} &0 \\s_x r_{31} &s_y r_{32} &s_z r_{33} &0 \\0 &0 &0 &1 \end{pmatrix} \\\\&=\begin{pmatrix}s_x r_{11} &s_y r_{12} &s_z r_{13} &t_x \\s_x r_{21} &s_y r_{22} &s_z r_{23} &t_y \\s_x r_{31} &s_y r_{32} &s_z r_{33} &t_z \\0 &0 &0 &1 \end{pmatrix} \\\\&= M\end{align*}
である。
これは、次のことを意味する。
$n$個($n \geqq 1$)のさまざまな変換行列$M_1, M_2, \ldots , M_n$があり、それらすべての積を、\[ M = M_nM_{n-1}\cdots M_2M_1 \]とする。このとき、$n$が非常に大きな数値であったとしても、結局は、ただ1つの平行移動行列$T$と、ただ1つの回転行列$R$、そして、ただ1つのスケール行列$S$の3つの行列の積によって、
\[ M = TRS \]として表すことができる。
つまり、どのように複雑に見える変換であったとしても、その変換は平行移動行列、回転行列、スケール行列を1つずつ使った3つの変換行列の積によって表すことができるということである。
以降では便宜上、変換行列を、平行移動行列、回転行列、スケール行列の3つの積に分解することを「TRS分解」と呼ぶことにする。
また、変換行列を$(Ex1)$の形に書き換えたときの、$s_x$、$s_y$、$s_z$ を変換行列の「スケール成分」、$(r_{11}, r_{21}, r_{31})$、$(r_{12}, r_{22}, r_{32})$、$(r_{13}, r_{23}, r_{33})$ を変換行列の「回転成分」、$t_x$、$t_y$、$t_z$ を変換行列の「平行移動成分」と呼ぶことにする。
今述べてきたことに関して、注意深い読者は疑問に感じられた点があったかもしれない。次の点である。
1つ以上の変換の合成を表す行列を $M$ としたときに、上ではこの $M$ が3つの行列 $T$、$R$、$S$ の積として次のように分解されることを示したわけである。
\begin{align*}M = TRS = \begin{pmatrix}1 &0 &0 &t_x \\0 &1 &0 &t_y \\ 0 &0 &1 &t_z \\0 &0 &0 &1\end{pmatrix}\begin{pmatrix}r_{11} &r_{12} &r_{13} &0 \\r_{21} &r_{22} &r_{23} &0 \\r_{31} &r_{32} &r_{33} &0 \\0 &0 &0 &1 \end{pmatrix}\begin{pmatrix}s_x &0 &0 &0 \\0 &s_y &0 &0 \\ 0 &0 &s_z &0 \\0 &0 &0 &1\end{pmatrix} \end{align*}
そして上記では行列 $T$、$R$、$S$ を平行移動行列、回転行列、スケール行列であるとして議論を進めていた。$T$ や $S$ が平行移動行列、スケール行列であることは自明である。しかし $R$ が回転行列であるといえるのかについては自明なことではない (ここでわかっていることは $R$ の各列の大きさが $1$ ということだけである)。3-11節の最後で述べたように、回転行列は直交行列であり、さらに行列式が $1$ であるという性質がある。この $M$ の分解において現れた\[R = \begin{pmatrix}r_{11} &r_{12} &r_{13} &0 \\r_{21} &r_{22} &r_{23} &0 \\r_{31} &r_{32} &r_{33} &0 \\0 &0 &0 &1 \end{pmatrix}\]が、直交行列であり行列式が $1$ であることを示さなければ $R$ が回転行列であるとはいえないのである。
しかし、結論から言うと $M$ を上のように$TRS$分解したときの $R$ は回転行列である。つまり $R$ は直交行列であり行列式が $1$ である (ただし $M$ は複数の変換行列の積ではあるが、スケールに関しては冒頭で述べた取り決めに従っているものとする)。
$TRS$分解したときの $R$ が回転行列であることの証明については
14-2節を参照 (代数学の知識がある読者は回転行列が特殊直交群の元であることから'あたり'がつけられるであろう)。
B) 具体例
上に述べたことを具体的な計算を通して見ていこう。
(注 : 以下において行列の成分が小数である場合は小数第3位を四捨五入し、少数点以下第2位までの表示にしている。ただし、以下で行われる行列の積の計算では四捨五入された値を使用していない。行列の積を計算する際には、四捨五入されていない値を使って計算し、結果だけを四捨五入して表示している。)
[例1]
$(3,\ 4,\ 5)$だけ平行移動させる平行移動行列を$M_1$、y軸周りに$-30$°回転させる行列を$M_2$とする。
\[M_1 = \begin{pmatrix}1 &0 &0 &3 \\0 &1 &0 &4 \\ 0 &0 &1 &5 \\0 &0 &0 &1\end{pmatrix}\qquad M_2 = \begin{pmatrix}0.87 &0.00 &-0.50 &0.00 \\ 0.00 &1.00 &0.00 &0.00 \\ 0.50 &0.00 &0.87 &0.00 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\]
x軸、y軸、z軸方向に$3$倍拡大させるスケール行列を$M_3$、x軸周りに $-45$°回転させる行列を$M_4$とする。
\[M_3 = \begin{pmatrix}3 &0 &0 &0 \\0 &3 &0 &0 \\ 0 &0 &3 &0 \\0 &0 &0 &1\end{pmatrix}\qquad M_4 = \begin{pmatrix}1.00 &0.00 &0.00 &0.00 \\ 0.00 &0.71 &0.71 &0.00 \\ 0.00 &-0.71 &0.71 &0.00 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\]
$(2,-20,-1)$だけ平行移動させる平行移動行列を$M_5$とする。
\[M_5 = \begin{pmatrix}1 &0 &0 &2 \\0 &1 &0 &-20 \\ 0 &0 &1 &-1 \\0 &0 &0 &1\end{pmatrix}\]これらの変換行列を以下の順序で掛け、その積$M$を計算する。
\begin{align*}M &= M_5M_4M_3M_2M_1 \\\\&=\begin{pmatrix}2.60 &0.00 &-1.50 &2.29 \\ 1.06 &2.12 &1.84 &0.85 \\ 1.06 &-2.12 &1.84 &2.88 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\qquad (Ex2)\end{align*}この$M$を$(Ex1)$の形に書き換える。
\begin{align*}M &= \begin{pmatrix}2.60 &0.00 &-1.50 &2.29 \\ 1.06 &2.12 &1.84 &0.85 \\ 1.06 &-2.12 &1.84 &2.88 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix} \\\\ &=\begin{pmatrix}3\cdot0.87 &3\cdot0.00 &3\cdot(-0.50) &2.29 \\ 3\cdot0.35 &3\cdot0.71 &3\cdot0.61 &0.85 \\ 3\cdot0.35 &3\cdot(-0.71) &3\cdot0.61 &2.88 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix} \end{align*}
書き換えられた$M$の成分を用いて A)で述べた方法により、平行移動行列、回転行列、スケール行列を作成する。
\[T = \begin{pmatrix}1 &0 &0 &2.29 \\0 &1 &0 &0.85 \\0 &0 &1 &2.88 \\0 &0 &0 &1\end{pmatrix} \qquad R = \begin{pmatrix}0.87 &0.00 &-0.50 &0.00 \\ 0.35 &0.71 &0.61 &0.00 \\ 0.35 &-0.71 &0.61 &0.00 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix} \qquad S = \begin{pmatrix}3 &0 &0 &0 \\0 &3 &0 &0 \\0 &0 &3 &0 \\0 &0 &0 &1\end{pmatrix}\]
実際に掛け合わせてみると、
\[TRS = \begin{pmatrix}2.60 &0.00 &-1.50 &2.29 \\ 1.06 &2.12 &1.84 &0.85 \\ 1.06 &-2.12 &1.84 &2.88 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\]となる。
$(Ex2)$の$M$と比較すると、行列の内容が同じであることが確かめられるだろう。すなわち、$M = TRS$ である (上記では回転行列$R$の成分も四捨五入されて表示されているが、四捨五入されていない値を使って計算すれば、$R$の任意の2列間の内積は$0$であり、$R$の行列式は$1$である)。
[例2]
y軸方向に$5$倍拡大させるスケール行列を$M_1$、$(-6,\ 4,\ 4)$だけ平行移動させる平行移動行列を$M_2$とする。
\[M_1 = \begin{pmatrix}1 &0 &0 &0 \\0 &5 &0 &0 \\ 0 &0 &1 &0 \\0 &0 &0 &1\end{pmatrix}\qquad M_2 = \begin{pmatrix}1 &0 &0 &-6 \\0 &1 &0 &4 \\ 0 &0 &1 &4 \\0 &0 &0 &1\end{pmatrix}\]z軸周りに$100$°回転させる行列を$M_3$、y軸周りに$40$°回転させる行列を$M_4$とする。
\[M_3 = \begin{pmatrix}-0.17 &-0.98 &0.00 &0.00 \\ 0.98 &-0.17 &0.00 &0.00 \\ 0.00 &0.00 &1.00 &0.00 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\qquad M_4 = \begin{pmatrix}0.77 &0.00 &0.64 &0.00 \\ 0.00 &1.00 &0.00 &0.00 \\ -0.64 &0.00 &0.77 &0.00 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\]
$(7,\ 6,\ 5)$だけ平行移動させる平行移動行列を$M_5$、x軸周りに$50$°回転させる行列を$M_6$とする。
\[M_5 = \begin{pmatrix}1 &0 &0 &7 \\0 &1 &0 &6 \\ 0 &0 &1 &5 \\0 &0 &0 &1\end{pmatrix}\qquad M_6 = \begin{pmatrix}1.00 &0.00 &0.00 &0.00 \\ 0.00 &0.64 &-0.77 &0.00 \\ 0.00 &0.77 &0.64 &0.00 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\]
これらの変換行列を以下の順序で掛け、その積$M$を計算する(この例では非一様スケール$M_1$が含まれているが、それは取り決め通り一番初めに実行される)。
\begin{align*}M &= M_6M_5M_4M_3M_2M_1 \\\\&=\begin{pmatrix}-0.13 &-3.77 &0.64 &7.35 \\ 0.55 &-2.98 &-0.59 &-7.99 \\ 0.83 &1.37 &0.49 &5.92 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\qquad (Ex3)\end{align*}この$M$を$(Ex1)$の形に書き換える。
\begin{align*}M &= \begin{pmatrix}-0.13 &-3.77 &0.64 &7.35 \\ 0.55 &-2.98 &-0.59 &-7.99 \\ 0.83 &1.37 &0.49 &5.92 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix} \\\\&= \begin{pmatrix}1 \cdot(-0.13) &5 \cdot(-0.75) &1 \cdot 0.64 &7.35 \\ 1 \cdot 0.55 &5 \cdot(-0.60) &1 \cdot(-0.59) &-7.99 \\ 1 \cdot 0.83 &5 \cdot 0.27 &1 \cdot 0.49 &5.92 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\end{align*}
書き換えられた$M$の成分を用いて A)で述べた方法により、平行移動行列、回転行列、スケール行列を作成する。
\[T = \begin{pmatrix}1 &0 &0 &7.35 \\ 0 &1 &0 &-7.99 \\ 0 &0 &1 &5.92 \\ 0 &0 &0 &1\end{pmatrix} \qquad R = \begin{pmatrix}-0.13 &-0.75 &0.64 &0.00 \\ 0.55 &-0.60 &-0.59 &0.00 \\ 0.83 &0.27 &0.49 &0.00 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix} \qquad S = \begin{pmatrix}1 &0 &0 &0 \\ 0 &5 &0 &0 \\ 0 &0 &1 &0 \\ 0 &0 &0 &1\end{pmatrix}\]
実際に掛け合わせてみると、
\[TRS = \begin{pmatrix}-0.13 &-3.77 &0.64 &7.35 \\ 0.55 &-2.98 &-0.59 &-7.99 \\ 0.83 &1.37 &0.49 &5.92 \\ 0.00 &0.00 &0.00 &1.00\end{pmatrix}\]となる。
$(Ex3)$の$M$と比較すると、やはりここでも $M = TRS$ であることが確かめられる。
変換行列をTRS分解するときには、積の順序は必ず、スケール、回転、平行移動の順序でなければならない。
そして、本節の冒頭でも述べたが、この講義で扱う変換行列は平行移動行列、回転行列、スケール行列の3種類であり、したがって、TRS分解の対象となる変換行列もこれら3種類の行列を掛け合わせたものである。
平行移動行列、回転行列、スケール行列を任意の順序でどれだけ多く掛け合わせても、$M = TRS$の形に分解することができるが、スケール行列に関しては冒頭でも述べたように、「非一様スケールは一番初めに実行し、それ以降は実行しない」、「倍率が$0$以下のスケールは実行しない」という制限がある。
変換行列の積がこの制限に違反している場合に、具体的にどういったことが起こるのかというと、TRS分解した際の回転成分が'破損'するのである。つまり、回転成分を用いて回転行列を作成しても、それは回転行列として正しいものではなくなってしまうのである (直交行列であり行列式が$1$という性質が失われる)。