整理すると各軸の回転式はこんな感じ。

Y軸での回転
x' = x cosθ - z sinθ
y' = y
z' = x sinθ + z cosθ

X軸での回転
x' = x
y' = y cosθ - z sinθ
z' = y sinθ + z cosθ

Z軸での回転
x' = x cosθ - y sinθ
y' = x sinθ + y cosθ
z' = z

 今回使ってる座標系は数学の時間に習ったZ軸の方向と逆転してる左手座標系というやつです。

テン・シー・シー-2
親指を回転軸の正の方向に向け、残る4本の指が向いている方向が正の回転方向という決まりだそうです。

テン・シー・シー-1
右手系が数学の時間に習う方ね。

 OpenGLは右手座標系とか書いてるな...
 ま、今回、話そうとしてる事には影響ないんで、そのまま左手座標系でやります。
 それと、これも今回の話からするとどうでもいいんだけど、上の式だと、Y軸での正の回転方向が逆になってしまうんで逆回転をするようにθを-θとおき、cosは-θもθも同じ値なので、そのまま、sinは符号が逆転するので-sinとし

Y軸での回転
x' = x cosθ + z sinθ
y' = y
z' = - x sinθ + z cosθ

とします。

 で、本題。
 通常3次元の描画は、こういう回転計算の嵐になるわけで...
 回転の回転のまた回転とか考えてみると、最初の回転の結果のx、y、zが次の回転に必要になるから、各頂点ごとに最初の回転から計算を始めないといけないことになるんですわ。それはさすがに辛いと...
 事前に全回転処理を計算して

x' = ax + by + cz
y' = dx + ey + fz
z' = gx + hy + iz

といったように、x、y、zの係数として事前にまとめて、一回の計算にできないの?
 ということになります。
 まず、この式で回転式が表現できるかというと、例えば、Y軸での回転なら

a = cosθ
b = 0
c = -sinθ
d = 0
e = 1
f = 0
g = sinθ
h = 0
i = cosθ

x' = cosθx + 0・y + -sinθz
y' = 0・x + 1・y + 0・z
z' = sinθx + 0・y + cosθz

 といった感じで、係数に0や1をまぜることで、全回転式が表現可能です。なので、回転の回転は、先の回転で移動したx'、y'、z'を次の回転のx、y、zとして扱えばいいので

最初の回転
x' = ax + by + cz
y' = dx + ey + fz
z' = gx + hy + iz

次の回転
x'' = a'x' + b'y' + c'z'
y'' = d'x' + e'y' + f'z'
z'' = g'x' + h'y' + i'z'

すなわち

x'' = a'(ax + by + cz) + b'(dx + ey + fz) + c'(gx + hy + iz)
y'' = d'(ax + by + cz) + e'(dx + ey + fz) + f'(gx + hy + iz)
z'' = g'(ax + by + cz) + h'(dx + ey + fz) + i'(gx + hy + iz)

となって、これをx,y,zの係数にまとめると

x'' = (a'a + b'd + c'g)x + (a'b + b'e + c' h)y + (a'c + b'f + c' i)z
y'' = ・
z'' = ・

て感じで、どうやらx、y、zの係数としてまとめる事ができそうってのがわかります。

 ここで「あれ?」と思った人、さすがっす。
 上のx、y、zの係数は、高校のときに習う「行列の積」と同じ結果になっとるわけですわ。

テン・シー・シー-3
ほらね。
 ていうか高校の時、なんで行列の積って、こんなパズルみたいな手順踏むんだと思ってたんですが(ちゃんと説明してくれてたのかもしれんが、教科書にパラパラ漫画を描きこむ作業に夢中で...)、このためだったんやね~。
 つ~ことで、複数の回転を繰り返された後のx、y、zの係数は回転式を表した行列同士の積の結果として求まるって事がわかります。
 で、あらためて行列で上の式を書き直すと

テン・シー・シー-4

は~、見た目すっきり。
ちなみに、各軸の回転を行列で書くとこんな感じ

テン・シー・シー-5

スケーリングもa = xのスケール、b = yのスケール、c = zのスケールとして

テン・シー・シー-6

で表現できる。
 当然、行列の積も計算可能なんで、X軸θ度回転後にx軸に2倍に拡大なんてことも、行列の積として表現できるわけっす。

テン・シー・シー-7
この行列の積で求まった行列が、最終的にx,y,zの係数となるわけです。

 ま、こうやって書くと、ごちゃごちゃした式が非常にすっきりするんで、3次元の世界では行列式が多用されます。
 あと平行移動なんですが、こいつは係数ではなく追加なんで行列の積にはならんわけです。
 x, y z同様の列になって、行同士の足し算になってしまう。

テン・シー・シー-8

 あと一歩なんだけどね~。
 で、ここで頭のいい人が x y z に 1 を追加して

テン・シー・シー-9

にしちゃって、3 x 3 行列も 4 x 4行列にして積を取るようにすればどうすかね?とか言い出したわけですよ。

テン・シー・シー-10
こんな感じ。

試しに計算すると

x' = 1 x + 0 y + 0 z + a
y' = 0 x + 1 y + 0 z + b
z' = 0 x + 0 y + 1 z + c
1 = 0 x + 0 y + 0 z + 1

すなわち

x' = x + a
y' = y + b
z' = z + c
1 = 1

 おお~、平行移動になってるわ。
 ちなみに、この場合の軸回転4x4行列はX軸回転を例にとると

テン・シー・シー-11

て感じになります。
 これで軸回転、拡大、平行移動計算式はすべて4x4行列で表現できて、積を取る事で複雑な組み合わせも計算できるぞと。
 あれ、まてよ、こ、これって~!
 CTMの説明で出てくるアフィン行列の3次元版じゃ~ん。

 ちゃんちゃん。

 視点、スクリーン位置、右手座標系、アフィンと、OpenGLを扱うための語彙はそろってきたので、次回からようやくOpenGL ESのプログラミングに入ります。iPhoneアプリ開発、その(90)からの宿題、サンプルプロジェクトの説明もそのときに。

 ちなみに行列ていう言い方より、英語のマトリックスって言い方が母型という意味もある点で好き。
 ではでは。