サンプル3


  今回は、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軸の正の方向(画面の上の方)からみたものです。
 

1つ目の赤い立方体を描く

  まず、glPushMatrix()をした時点では、座標系は、視点のところに固定されています。(サンプル1の解説を参照)

  ここで、glTranslatef(0.0, 0.0, -15.0)を呼ぶと、現在の座標系(図では色の着いた座標系)のz軸方向に、座標系を移動します。

  さらに、座標系が移動した状態で、glRotatef(30, 0.0, 1.0, 0.0)を呼ぶと、現在の座標系の原点を中心に、座標系を回転します。

  最後に、移動して回転した後の座標系の上に赤い立方体を描きます。結果として、立方体は、視点の正面に、30度左を向いた状態で描かれます。

2つ目の緑色の立方体を描く

  今度は、先にglRotatef()を呼んで次に、glTranslatef()を呼んでいます。
  まず、最初の状態では、上と同じように座標系は視点に固定されています。

  ここで、glRotatef(10, 0.0, 1.0, 0.0)を呼ぶと、その場で座標系が回転します。

  さらに、glTranslatef(0.0, 0.0, -20.0)を呼ぶと、回転した座標系のz軸方向に座標系を移動します。

  そして、そこに、立方体を描きます。結果として、立方体は、視点から左の奥の方に描かれます。

  この例で、座標系を平行移動するとか、座標系を回転させるという意味がわかっていただけたでしょうか?


  次回はいよいよ3Dのアニメーションです。でも、その前に今回のglTranslatef()とglRotatef()をしっかり理解しておいてください。これが理解できないと、アニメーションさせるときに、どんな風に動かしたかったら、どんな風にプログラムを書いたらいいかわからないでしょう。


戻る