電子ガジェットいろいろ

電子系のガジェットやアプリ開発等の話題を書いてます

iPhone SDKでOpenGLに挑戦 立方体を表示してみよう

今回は基本的なオブジェクトとして立方体の表示方法を説明します。

以前のエントリ"OpenGLの簡単な遊び方"と同じように、"OpenGL ES Application"のテンプレートを使って説明します。


・新規プロジェクト作成
新規プロジェクト作成時に"OpenGL ES Application"のテンプレートを選びます。


・立方体のオブジェクト定義

"EAGLView.m"にあるdrawViewメソッドを修正します。

立方体の頂点を定義するために、squareVerticesの配列定義を以下のように修正します。


const GLfloat squareVertices[] = {
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, -0.5f, -0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, -0.5f,
0.5f, 0.5f, 0.5f,
};

色の定義も頂点分定義します。
今度は面が6個あるので、初期定義の値をそのまま5個コピーして定義します。


const GLubyte squareColors[] = {
255, 255, 0, 255,
0, 255, 255, 255,
0, 0, 0, 0,
255, 0, 255, 255,
255, 255, 0, 255,
0, 0, 0, 0,
0, 255, 255, 255,
255, 0, 255, 255,
255, 255, 0, 255,
0, 255, 255, 255,
0, 0, 0, 0,
255, 0, 255, 255,
255, 255, 0, 255,
0, 0, 0, 0,
0, 255, 255, 255,
255, 0, 255, 255,
255, 255, 0, 255,
0, 255, 255, 255,
0, 0, 0, 0,
255, 0, 255, 255,
255, 255, 0, 255,
0, 0, 0, 0,
0, 255, 255, 255,
255, 0, 255, 255,
};

今回もX軸の回転だけではつまらないので、Y軸の回転も加えます。
glRotatef()を実行している部分を以下のように修正します。


glRotatef(3.0f, 1.0f, 1.0f, 1.0f);

頂点配列にZ座標が加わりましたので、glVertexPointer()を実行している部分を以下のように修正します。


glVertexPointer(3, GL_FLOAT, 0, squareVertices);

立方体は頂点が24個になりますので、glDrawArrays()を実行している部分を以下のように修正します。


glDrawArrays(GL_TRIANGLE_STRIP, 0, 24);

これでオブジェクトの定義はおわりですが、このまま実行すると、変な具合に実行されます。

この原因はここでは説明しませんが、Zバッファを有効にすることにより、今回の意図通りに表示させることができます。

・Zバッファの有効化

まず、"EAGLView.m"にのヘッダ辺りにあるdefineの値を修正します。
"#define USE_DEPTH_BUFFER 0"と書いてあるで、0を1に変更してください。


#define USE_DEPTH_BUFFER 1

次に、"EAGLView.m"にあるinitWithCoderメソッドを修正します。
"animationInterval = 1.0 / 60.0;"と書いてある箇所がありますので、次の行あたりに以下の文を加えてください。


glEnable(GL_DEPTH_TEST);

最後に"EAGLView.m"にあるdrawViewメソッドでglClear()を実行している箇所でZバッファのビットを加えます。


glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);

以上の修正をすることにより、Zバッファが有効になります。

OpenGLプログラミングガイド 原著第5版

OpenGLプログラミングガイド 原著第5版