OpenGLのテスト

さて、新しくプログラムを作るにあたって、今まで何もしていなかったわけではなく、OpenGLのテストなどしておりました。

AndroidでOpenGLをする場合、というか、OpenGLを使おうとした場合、最初につまずくのはモデルデータの準備ではないでしょうか?

この問題をクリアするために、Wavefront OBJファイルからのコンバーターを作ってみました。

Wavefront OBJファイルについては、3D方面に知識を持つ人ならば、説明の必要もないと思いますが、多くの3Dモデリングソフトなどでエクスポート/インポートが可能なファイル形式です。

構造としてはとても分かりやすく、

# Blender3D v249 OBJ File:
# www.blender3d.org
mtllib dice.mtl
g Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt 0.750001 0.750000
vt 0.500000 0.750000
vt 0.500000 0.500000
vt 0.750000 0.500000
vt 0.500000 0.250000
vt 0.750000 0.250000
vt 0.500000 0.000000
vt 0.750000 0.000000
vt 0.250000 0.500000
vt 0.000000 0.499999
vt 0.250000 0.250000
vt 0.000000 0.249999
vt 1.000000 0.500000
vt 1.000000 0.250000
vn 0.000000 0.000000 -1.000000
vn -1.000000 -0.000000 -0.000000
vn -0.000000 -0.000000 1.000000
vn -0.000001 0.000000 1.000000
vn 1.000000 -0.000000 0.000000
vn 1.000000 0.000000 0.000001
vn 0.000000 1.000000 -0.000000
vn -0.000000 -1.000000 0.000000
usemtl Material
s off
f 5/1/1 1/2/1 4/3/1
f 5/1/1 4/3/1 8/4/1
f 3/5/2 7/6/2 8/4/2
f 3/5/2 8/4/2 4/3/2
f 2/7/3 6/8/3 3/5/3
f 6/8/4 7/6/4 3/5/4
f 1/9/5 5/10/5 2/11/5
f 5/10/6 6/12/6 2/11/6
f 5/13/7 8/4/7 6/14/7
f 8/4/7 7/6/7 6/14/7
f 1/9/8 2/11/8 3/5/8
f 1/9/8 3/5/8 4/3/8

こんな感じです。
これは、単純な6面体のモデルデータで、最初の方のvは、頂点座標、次のvtはテクスチャのUV座標、次のvnは頂点の法線ベクトルです。
そして、最後のfは、面を構成する頂点の情報を、インデックスで表わしていて
f [頂点1の座標インデックス]/[頂点1のテクスチャ座標インデックス]/[頂点1の法線ベクトル] [頂点2の・・・
という具合になっています。
上のファイルでは、面を3つの座標で構成しているので3角形ですね。

これをあらかじめ、JavaアプリケーションでAndroidのByteBufferで読みやすいようバイナリファイルに出力しておくことにしました。
注意するのは、面を構成する頂点の回転方向と、テクスチャUV座標の向きです。

最初はこれでつまずいて、うまく表示されませんでした。
(objファイルの面を構成する頂点の回転方向が、探しても見つからなかったのです)

ようやくクリアして今の状態がこんな感じです。

(相変わらずのUFOが、3Dでぐるぐる回ってます。どうでもいいけど、エミュレータで7fpsしか出てません。遅い!)

ここまで作って力尽きたのですが、今回作るのは2Dゲーム。ここまでの機能は必要ないんですね。

これを使った次のゲームも構想中です。

こちらの本を大いに参考にさせていただきました。

Leave a Reply

This blog is kept spam free by WP-SpamFree.