今回は、3次元空間で、図形の位置や向きを自由に変えられるようにしましょう。
void glTranslatef(GLfloat x, GLfloat y, GLfloat z)
平行移動します。void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
その場での回転。(x,y,z)というベクトルを軸にして、角度angle度だけ回転します。回転の方向は、右ネジの方向です。
今回は使っていませんが、似たような使い方をする関数として、次のような関数があります。
void glScalef(GLfloat x, GLfloat y, GLfloat z)
拡大・縮小をします。
それから、座標変換用の行列を操作する関数として、次の2つを使っています。
void glPushMatrix(void)
void glPopMatrix(void)
glPushMatrix()を呼ぶと、呼ばれた時の行列を保存し、glPopMatrix()を呼ぶと、glPushMatrix()を呼ぶ前の行列の状態に戻します。当然のことながら、glPushMatrix()とglPopMatrix()は対で呼ばれなければなりません。
ちなみに、
void glVertex3fv(const GLfloat *v)
ポリゴンが増えてくると、glVertex3f()では頂点を指定するのがめんどくさくなってきます。こういうときは、glVertex3fv()を使った方がすっきりするでしょう。そのほかのコードは、サンプル2と基本的に同じです。
glTranslatef() | = | 今の座標系を基準に、座標系を平行移動 |
glRotatef() | = | 今の座標系の原点を中心に、座標系を回転 |
これだけではわかりにくいので、サンプルプログラムを例にとって解説してみます。まず、display_func()の中を見てください。
*図は、y軸の正の方向(画面の上の方)からみたものです。
ここで、glTranslatef(0.0, 0.0, -15.0)を呼ぶと、現在の座標系(図では色の着いた座標系)のz軸方向に、座標系を移動します。
さらに、座標系が移動した状態で、glRotatef(30, 0.0, 1.0, 0.0)を呼ぶと、現在の座標系の原点を中心に、座標系を回転します。
最後に、移動して回転した後の座標系の上に赤い立方体を描きます。結果として、立方体は、視点の正面に、30度左を向いた状態で描かれます。
ここで、glRotatef(10, 0.0, 1.0, 0.0)を呼ぶと、その場で座標系が回転します。
さらに、glTranslatef(0.0, 0.0, -20.0)を呼ぶと、回転した座標系のz軸方向に座標系を移動します。
そして、そこに、立方体を描きます。結果として、立方体は、視点から左の奥の方に描かれます。
この例で、座標系を平行移動するとか、座標系を回転させるという意味がわかっていただけたでしょうか?
次回はいよいよ3Dのアニメーションです。でも、その前に今回のglTranslatef()とglRotatef()をしっかり理解しておいてください。これが理解できないと、アニメーションさせるときに、どんな風に動かしたかったら、どんな風にプログラムを書いたらいいかわからないでしょう。