2009年6月18日木曜日

[Pv3D]Papervision3Dをやってみた その3[AS3.0]


今回はCollada形式(DAE)のファイルをPv3Dで読み込んでみました。

完成品ソースコード

まずGoogleの3Dギャラリーから適当なファイルをダウンロード。
利用規約は読んだけど多分問題はないはず。

拡張子daeのファイルがあるので、それをソースフォルダに持っていき、あとは、
var dae:DAE = new DAE();
dae.load("model.dae");
scene.addChild(dae);

と書けば表示されます。
だたし、こちらで解説されているように"org/papervision3d/core/proto/MaterialObject3D.as"の"tiled"の値を"true"にしないと正しく表示されません。

これだけだったらあまり苦労はしません。
Flex Builder上で実行するのにはエラーはでません。しかし、生成したswfファイルを実行すると、「ローカルファイルシステムの SWF および信頼されているローカル SWF ファイルのみがローカルリソースにアクセスできます。」といったエラーが発生します。
これを解決するには、モデルとテクスチャのファイルの埋め込みが必要になります。
今回一番苦労したのがこれです。


テクスチャファイルの埋め込みと、そのマテリアルリストの作成はこんな感じです。
[Embed(source='model/images/texture0.jpg')]
private var texture0:Class;    // 画像埋め込み
var material0:Bitmap = new texture0() as Bitmap;
var myMaterials:Object = {
material_2_1_8_image: new BitmapMaterial(material0.bitmapData)
}

上の「material_2_1_8_image」の部分は、daeファイルをテキストエディタで開き、画像ファイル名を検索すると、このようになっています。
<image id="material_0_23_8_image" name="material_0_23_8_image">
<init_from>../images/texture0.png</init_from>
</image>

この"id"と"name"の値です。
自分が使用したdaeファイルは、この値が「material_0_23_8-image」というようになっていましたが、"-"を含むとASでエラーになるので、"_"に置換しています。


モデルデータの埋め込みとロードはこんな感じです。
[Embed(source="model/model.dae", mimeType="application/octet-stream")]
var daeFile:Class;
var daeObject:DAE = new DAE();
daeObject.load(XML(new daeFile()), new MaterialsList(myMaterials));


テクスチャの画像が多いと埋め込みが非常に面倒です。
鮭さんのほうで紹介されていたこちらを使わせてもらいました。便利便利。
今回の完成品ですが、一部のテクスチャの表示がうまくいってません。見逃してください。


今回の参考サイトはこちらです。
http://sakeprog.cocolog-nifty.com/sake/2008/08/papervision3d38_7285.html
http://blog.r3c7.net/?p=113
http://d.hatena.ne.jp/sakusan_net/20080702/1215003280


----------------------------------------
2009/10/18 追記
一部訂正しました。→こちら

0 件のコメント:

コメントを投稿