今回は、簡単な3D表示に挑戦します。
頂点の指定は、2Dのときとほとんど同じで、ただ、glVertex2f()の代わりに、glVertex3f()を使うだけです。
それから、投影変換ですが、OpenGLでは、次の2種類の投影変換のどちらかを指定します。
最後に、2次元平面上にポリゴンを描くのですが、OpenGLは、デプスバッファを使った方法のみをサポートしています。ポリゴンが重なったりしないような特殊な場合を除いて、デプスバッファを使うように指定します。
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を呼ぶと、それからの処理が、どの行列に対して行われるか指定することができます。void glLoadIdentity(void)
今回のサンプルの場合、reshape_func()の中で、投影変換行列の初期化をしているので、GLPROJECTIONを指定します。
行列を、単位行列に初期化します。glFrustum()や、glOrtho()の前に呼ぶ必要があります。void glFrustum(l, r, b, t, n ,f)
遠近法を使った投影を行うことを指定します。それとともに、投影範囲も指定します。各引数と、投影される空間の関係は下の図の通りで、図の青い部分が画面に表示されます。
display_func()の中
void glClear(GLbitfield mask)
デプスバッファを使っているので、GL_DEPTH_BUFFER_BITも指定して、デプスバッファもクリアするようにします。void glVertex3f(GLfloat x, GLfloat y, GLfloat z)
3次元空間内でポリゴンの頂点を指定します。z座標が加わったこと以外は、glVertex2f()とかわりません。
アニメーションもしない簡単なサンプルですが、これで3次元空間に図形を描くことができました。今回は、3D表示をするための初期化などの方法を理解してください。