2013年11月3日日曜日

Androidアプリ開発:Blenderで作成したモデルをopenGL ESで表示したい

Androidのアプリで3Dモデルデータを表示するサンプルプログラムがあります。表示用のサンプルデータも添付していて、それを表示する分には問題ないんですが、自分でモデルを作成したくなりました。
とりあえず簡単に手に入るモデラーとしてBlender(2.69)で簡単な立方体を作成して、表面に色をつけてみました。ところがどうしても表示できません。モデルデータはWavefrontのobj形式です。添付されていたobjファイルはBlenderで作成したものではなく、若干キーワードに相違はありましたが、プログラム内でデータ読み込みをしている部分を調べた限りでは問題なさそうに見えます。
結局、2,3日かかりましたがBlenderでobjファイル形式でExportするときはこのアプリでは以下の注意が必要でした。

1.法線ベクトルを出力する
デフォルトでは法線ベクトルの出力がoffになっています。"Include Normals"にチェックを入れてやりましょう。(→これでobjファイルに、vn成分が出力されるようになります。)

2.面の定義が終了したことを示すための別の行を入れる
これはたまたま参考にしたサンプルプログラムの仕様でしたが、これを見つけるのが一番時間がかかりました。objファイルには面の定義のf行(頂点番号/テクスチャ座標の番号/法線の番号)が一つのオブジェクトで連続して出力されていますが、データの最終行を示すマークがありません。サンプルプログラムでは、何か別の行を読み込んだときにf行が終了したと判断して、自分のobjectデータに登録していました。
Blenderでobj形式で出力してやると、最後の行がf行で終了していました。つまり、サンプルプログラムが最後のobjectの塊を認識できないことになります。(1個しか定義してなければ、0個になります。)ここは仕方なく、手作業で1行害のなさそうな”usemtl default”を最終行に追加しておきました。(複数のobjectが定義してあれば、次のobjectの定義の始まりで通常は認識できるんですが。。。)

3.面は三角形で出力する
上記まででサンプルプログラムに自分がBlenderで作成した立方体が表示されるようになりましたが、各面が三角形で表示されます。Blenderの出力を見ると四角形でf行を出力していました。OpenGLは面の定義が基本三角形のはずで、BlenderのExport時のデフォルトが四角形になっていました。これを三角形にしてやります。("Triangulate Faces"にチェックを入れてやります。)
これで無事立方体が表示されました。

参考までに、2つチェックしたExportの設定画面をのせておきます。


objファイルは色の定義に*.mtlファイルが別途必要になります。ちょっと面倒なので、今度はcollada形式を調べてみようかと思います。

0 件のコメント:

コメントを投稿