2011年7月9日土曜日

[Blender] obj2opengl.plをJava用に改造する

Blender object to OpenGL for Android Java

3DCG作成ツール「Blender」のobjファイルをC言語のhファイルに変換するperlスクリプト「obj2opengl.pl」を使ってみました。
obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES « Heiko Behrens (Blog): http://heikobehrens.net/2009/08/27/obj2opengl/
からHBehrens-obj2opengl-a0f123e.zipをダウンロードしました。

BlenderのデータをAndroidでも使いたいのでobj2opengl.plをobjファイルをjavaファイルに変換するように改造してみました。

改造した内容は次の通りです。
・float型の数値にサフィックスfをつける
・クラス名・変数名が数字で始まる場合は先頭に「_」をつける
・unsigned intをintに変更
・クラス名・ファイル名の最初の文字が小文字なら大文字に変換する
・パッケージのステートメント追加
・FloatBuffer宣言の追加

ソースです。
obj2opengl4java.pl
obj2opengl4java.pl の使い方
obj2opengl4java.plはコマンドプロンプト(コンソール)で操作します。
変換したいオブジェクトファイルはHBehrens-obj2opengl-a0f123e.zipに含まれているcube.objとします。
obj2opengl4java.plとオブジェクトファイル(cube.obj)を同じフォルダーに保存します。
カレントフォルダーはファイルを保存したフォルダーとします。

WindowsならActivePerlなどをインストールしperl.exeのPath設定してコマンドプロンプトから
perl obj2opengl4java.pl cube.obj
と入力します。

CygwinやLinuxなら
./obj2opengl4java.pl cube.obj
と入力します。

成功するとCube.javaが作られます。
Cube.javaをAndroidプロジェクトにインポートし、パッケージ名を適切に修正してください。
Cube.java(コメント行は省略)

Activityのソースです。
Main.java

このソースを実行するとこうなります。

Blenderで作った球体を回転させるサンプルも作ったらこんな感じになりました。(ソースは省略)
※ただの円に見えますが球です。

Javaにまつわる難点
BlenderのオブジェクトファイルをJavaソースに変換する上で大きな問題があります。
Javaの仕様により定数プールは65536エントリー以内と決められています。
コンストラクターやメソッドは65536バイト以内でなければいけません。
たとえばHBehrens-obj2opengl-a0f123e.zipに含まれるbanana.objは頂点の多いのでJavaソースに変換してもビルドできません。
定数プールが65536エントリーを超えています

頂点の多いポリゴンはAndroidで扱えないのでしょうか?
答えは「いいえ」です。その方法は・・・次回に続く。(7月16日予定)


以上、参考になれば幸いです。

2 件のコメント: