https://dl.dropboxusercontent.com/u/108473486/OBJLoader/objLoader.htmlhttps://dl.dropboxusercontent.com/u/108473486/OBJLoader/OBJLoader.zip前回、かぼちゃをプルプル動かしましたが、色んなモデルを動かしてみたくて、Unity3D アプリを起動した後に、3Dモデルを読み込む機能を探してみました。
どうもそのようなものは無く、自分でローダーを作る必要があるようです。
http://www.everyday3d.com/blog/index.php/2010/05/24/loading-3d-models-runtime-unity3d/に OBJ フォーマットのローダーが公開されていました。
何ゆえに OBJ が選ばれているかというと、仕様が簡単だからです。
このローダーで対応している OBJ ファイルのタグは、
o オブジェクト定義(GameObject になる)
g グループ
v 頂点座標
vt テクスチャ座標
vn 頂点法線ベクトル
f 頂点番号列によるポリゴン定義
mtllib マテリアル定義ファイル名
usemtl 使用するマテリアル名
で、マテリアルファイルのタグは
newmtl マテリアル名
Ns シャイニネス
Ka アンビエント(ただし、このローダーではサポートしていない)
Kd ディフューズ
Ks スペキュラー
d 又は Tr トランスペアレンシー
illum イルミネーションモード 1:ディフューズ 2:スペキュラー
map_Kd テクスチャファイル名(ただし、WWWクラスで読み込むので、PNG か JPEG のみが有効)
です。
このページで公開されているローダのままで、Blender monkey
http://www.everyday3d.com/unity3d/obj/monkey.obj
が表示できます。
たぶん、セキュリティでために、冒頭に記載した objLoader.html を表示しても、Blender monkey は表示できないかと思いますので、objLoader.zip をダウンロードしてから表示してみて下さい。
ただし、他のモデルだと色々不都合が起こりましたので、以下の修正を行いました。
・オブジェクトとグループは、名称を省略されても良いようにした。
・マテリアルが定義されていないとき、デフォルトのマテリアルを設定するようにした。
・テクスチャと法線が定義されているのに、面の定義でその設定が省略されているときは、
頂点番号と同じ番号のものを使うようにした。
・面が四角形以上の多角形の場合、三角形分割するようにした。
・d か Tr が 1 未満のときは、Transparent/Diffuse か Transparent/Specular シェーダを使うようにした。
また、描画速度を向上するために、以下の修正も行いました。
・現在と同じマテリアルが定義されたときは、何もしないようにした。
・同じテクスチャファイルは一度しか読まないようにした。
さらに、モデルによっては、三角形の裏面を描画したいときもあるので、裏面、表面、両面と指定できるようにしました。
これでやっと画像で紹介した初音ミク miku.obj がそれなりの速度で描画できるようになりました。
モデルは
http://www.3dvia.com/warehouse/からダウンロードできますが、登録が必要です。
このモデルではテクスチャファイルとして TGA が使われているので、PNG に変換して使っています。
また、なぜか Tr=0 になっているので、1 に変更しました。
対応していないフォーマットも多々あるかと思いますが、とりあえず、ここまでで自己満足です。
OBJ ファイルをドラッグ&ドロップで表示できるようにしたいのですが、まだできません。
Unity3D ではできないような...
[苦]Diffuse シェーダ以外のシェーダの組み込みDiffuse シェーダは WebPlayer からも実行後にロードできるのですが、Specular シェーダなどはロードできません。
Shader.Find( "Specular" )
が null になります。
シーンで使用されているシェーダしか組み込まれないようです。
このため、Specular シェーダなどを使ているダミーオブジェクトを非表示状態でシーンに登録して、必要なシェーダを獲得できるようにしています。
あまりスマートではないと思いますが、他に方法がありますでしょうか?
[注]頂点数は65000以下でないとダメ。OBJ フォーマットに限った制限ではありませんが、OBJ の場合、モデル全体が一塊で定義されていることが多く、この制限を越えるサンプルがよくあります。