サンプル2


  今回は、簡単な3D表示に挑戦します。


目次

3D処理の流れ

  サンプルプログラムを見る前に、3D処理の流れを簡単に説明しておきます。
  1. まず最初に、3次元空間上でポリゴンの頂点を指定する。
  2. 次に、投影変換をして、3次元空間から2次元空間にポリゴンの頂点座標を変換する。
  3. 変換された頂点座標を使って、2次元平面上にポリゴンを描く。
  だいたい、上のような順です。それぞれ、プログラム中でやらなければならないことは、以下の通りです。

  頂点の指定は、2Dのときとほとんど同じで、ただ、glVertex2f()の代わりに、glVertex3f()を使うだけです。

  それから、投影変換ですが、OpenGLでは、次の2種類の投影変換のどちらかを指定します。

どちらの投影法を使う場合でも、視野の範囲の設定などをすることができます。

  最後に、2次元平面上にポリゴンを描くのですが、OpenGLは、デプスバッファを使った方法のみをサポートしています。ポリゴンが重なったりしないような特殊な場合を除いて、デプスバッファを使うように指定します。


2Dの時との違い

  3D表示になったからといって、前回の2D表示のときとプログラムが大きく変わるわけではありません。ここでは、サンプルプログラムを見ながら、2Dと3Dで違う部分だけを解説していきます。

main()の中
void glutInitDisplayMode(unsigned int mode)

  3D表示を行うので、デプスバッファを確保するように指定します。具体的には、GLUT_DEPTHを付け加えます。
void glEnable(GLenum cap)
  今回は、GL_DEPTH_TESTを指定して、OpenGLがデプスバッファを使うように指定します。
reshape_func()の中

void glMatrixmode(GLenum mode)

 OpenGLでは、投影変換や、サンプル3で解説するように、図形の移動や回転をするのに、行列計算を使っています。そのため、OpenGLでは、投影変換用行列(GL_PROJECTION)、移動や回転用の行列(GL_MODELVIEW)と、テクスチャ用の行列(GL_TEXTURE)があります。glMatrixModeを呼ぶと、それからの処理が、どの行列に対して行われるか指定することができます。
  今回のサンプルの場合、reshape_func()の中で、投影変換行列の初期化をしているので、GLPROJECTIONを指定します。
void glLoadIdentity(void)
  行列を、単位行列に初期化します。glFrustum()や、glOrtho()の前に呼ぶ必要があります。
void glFrustum(l, r, b, t, n ,f)
  遠近法を使った投影を行うことを指定します。それとともに、投影範囲も指定します。各引数と、投影される空間の関係は下の図の通りで、図の青い部分が画面に表示されます。
glFrustum


display_func()の中

void glClear(GLbitfield mask)

  デプスバッファを使っているので、GL_DEPTH_BUFFER_BITも指定して、デプスバッファもクリアするようにします。
void glVertex3f(GLfloat x, GLfloat y, GLfloat z)
  3次元空間内でポリゴンの頂点を指定します。z座標が加わったこと以外は、glVertex2f()とかわりません。

  アニメーションもしない簡単なサンプルですが、これで3次元空間に図形を描くことができました。今回は、3D表示をするための初期化などの方法を理解してください。


戻る