日本産ゲームエンジンを作ろう 第3回

3Dモデルについて

 3Dモデルって何だかわからないのでいつも通りインターネットで調べました。何やるにもまずは下調べです、ほんと知識は大事ですね。 インターネットは自分の無知を補間するには十分すぎる情報があります。ありがたいです。  ゲーム等で使われてるモデルは専用の描画ソフトを使って描いたものをOpenGLに取り込んでいるみたいです。取り込む際、描画ソフト が出力するファイルにはそれぞれ描画ソフト用のフォーマットが決まっていてOpenGLに取り込むためのライブラリが用意されているようです。 ライブラリがない場合は気合で自作する必要があるみたいです。ゲームエンジンを作るなら完成されたモデルを取り込むにも、 まずは3Dモデルがどのようなものなのか理解しとくべきですよね。今回はそんな3Dモデルを理解してみたいと思います。

OpenGLにおける3Dの考察

 2DはX軸、Y軸のような2つの軸で平面を表しています。想像はつくと思いますがX軸が横方向、Y軸が縦方向を表現します。 これに対して3DはZ軸と言うものが追加されていて奥行きを表現します。2Dや3Dと聞くと平面に見えるか立体的に見えるかの違いに思えますが、 実はOpenGLで言う2D及び3Dは違います。OpenGLで言う3Dはただ単に立体的に見えると言ったようなものではなく、リアルに近い3D空間のことで 空間があり物体を配置して自分がその空間の中で撮影したものをスマホ画面からユーザに見せるような感覚です。

モデルを描く

 いきなり、モデルを描くとっても意味がわからないのでインターネットからパクりましょう。JavaのFrameクラスにGLCanvasを追加します。 下図のような構成です。簡単ですね。
// ******************** // キャンバスの設定 // ******************** // キャンバスの生成 glCanvas = new GLCanvas(); // イベントハンドラの登録 glCanvas.addGLEventListener(this); // GLEventListenerインタフェースを登録 // Frameに設定 frame.add(glCanvas);
gl.glClear(GL.GL_COLOR_BUFFER_BIT); // 行列の保存 gl.glPushMatrix(); gl.glColor3f(1.0f, 1.0f, 1.0f); // 胴体 gl.glPushMatrix(); gl.glScalef(1.0f, 1.0f, 0.5f); glut.glutSolidCube(1.0f); gl.glPopMatrix(); // 左手 gl.glPushMatrix(); gl.glTranslatef(0.65f, -0.1f, 0.0f); gl.glScalef(0.2f, 1.2f, 0.2f); glut.glutSolidCube(1.0f); gl.glPopMatrix(); // 右手 gl.glPushMatrix(); gl.glTranslatef(-0.65f, -0.1f, 0.0f); gl.glScalef(0.2f, 1.2f, 0.2f); glut.glutSolidCube(1.0f); gl.glPopMatrix(); // 左足 gl.glPushMatrix(); gl.glTranslatef(0.3f, -1.05f, 0.0f); gl.glScalef(0.2f, 1.0f, 0.2f); glut.glutSolidCube(1.0f); gl.glPopMatrix(); // 右足 gl.glPushMatrix(); gl.glTranslatef(-0.3f, -1.05f, 0.0f); gl.glScalef(0.2f, 1.0f, 0.2f); glut.glutSolidCube(1.0f); gl.glPopMatrix(); // 頭 gl.glPushMatrix(); gl.glTranslatef(0.0f, 0.95f, 0.0f); glut.glutSolidSphere(0.4f, 20, 20); gl.glPopMatrix(); // 行列の復元 gl.glPopMatrix();
 相当省略しましたが、実行すると以下の通りです。正直わかりにくいですね。 人型の何かが書いてあるくらいしかわかりませんね。
 胴体に色を付けて投影角度を変えてみました。さっきよりはわかりやすくなったのではないでしょうか。
 このようにOpenGLのAPIを使えば「球体」「立方体」など3Dのモデルを描画することができるんですね。ちなみに 物体の角度を変えるには以下のAPIを使いました。
gl.glTranslatef(横移動距離, 縦移動距離, 奥行き移動距離);

3Dを体験してみる

 前の説明では3Dをなんとか感じることができたものの、満足するにはまだまだ足りませんでした。先ほど作っていた モデルビューアを改造してみました。ちなみにゲームエンジンに流用できそうです。
 キーボードで横移動、縦移動をてきるようにしてみました。そして、マウスで横回転、縦回転、奥行き移動を 実装してみました。おまけで地面とXYZ軸も描画してみました。初めて作った割には形になっているかと思います。
 拡大してみました。いい感じに3Dっぽくなってます。この人型のモデルって立っているのかと思ってたけど、 寝そべってるんですね。地面書いて初めてわかりました。ちなみにこのモデルビューアは作り上げるのに半日くらいの 時間でできました。

まとめ

 第3回で学んだことをまとめます。3Dがなんとなくわかったような気がします。
  • OpenGLは2D/3D両方描画できる
  • OpenGLの3Dは見た目だけじゃなく、リアルの3D空間を作り出す
  • 球体や立方体等はモデルを構成する基本的な最小モデルである。ちなみにこれをポリゴンと言う
  • 空間を回転することができる
  • 空間の左右に移動することができる
  • 空間の奥行き前後に移動することができる
  • 視野(カメラ)の解像度を変えることができる
 今回はOpenGLのAPIを通じて、3Dを体験することができた。しかし、使ったAPIは限定的でありOpenGLの機能を 理解したのはほんの一部分だけである。またゲームは3Dだけではなく2Dのゲームも存在する。そのため、ゲームエンジンを作るには 2Dも理解する必要がある。
以上です。
メッセージを残す
名前: メッセージ:
Copyright © takamax All Rights Reserved