Papervision3Dでのdaeモデル読み込み(実用編
下記でPaperVisionでのモデル読み込みを紹介していました。
http://d.hatena.ne.jp/sakusan_net/20080303/1204515807
これには「非常に」罠が多く、正直かなりやってられないわけですが、一応表示できるところまでやっていました。
ですが、ビルド結果のSWFをクリックしないと「ローカルファイルシステムの SWF および信頼されているローカル SWF ファイルのみがローカルリソースにアクセスできます。」というエラーがFlexの警告として表示されます。
これはクロスドメインでのファイル参照を避けるために出る警告で、SWFをクリックして実行する場合は実行と同じ場所にファイルが存在するのでエラーが出ません。
デバッグ実行できないというのは正直かなりあほらしいので今回は以下の点に重視して解説します
・モデルファイルをSWFに埋め込む。
・テクスチャファイルをSWFに埋め込む
・デバッグモードで実行可能にする
まず前回の記事からモデル作成段階までを引用します。
前回までのあらすじ
使うソフトは メタセコイヤ(モデリングソフト 半フリー)http://www.metaseq.net/
と Vixar(アニメーションソフトを変換用に使う フリー)です。http://www.vixar.jp/motion/
1、メタセコイヤでモデルを作成、もしくは変換してmqoファイルを作成。
注意点:この時点で必ずテクスチャを張ること。
2、Vixarでmqoファイルを読み込み、別名で保存でdae方式を指定する。
注意点:必ず「UV座標」にチェックを入れる
3、保存したdaeファイルを開いてテクスチャ画像を相対パスに直す。
開くと指定したテクスチャが c:\***\tex.jpg とかになってるのでファイル名だけにする
ここまでが前回の状態でした。
この状況では以下のコードで参照することができます。(デバッグ実行はできません)
var cmodel:Collada = new Collada("model.dae"); scene.addChild(cmodel); //sceneはScene3D
今回のお話
さて、ここからがメインです。
方法の説明なんですが、
1、まずdaeファイルを画像同様Embedで読み込みます。
2、同じように全テクスチャファイルをEmbedで読み込みます。
3、hoge:Objectに対し、読み込んだ画像ファイルをBitmapMaterialとして列挙します。
4、Colladaをnewする際に第二引数として作成したObjectを渡します。
5、addChildして描画する。
*MaterialListが登録された場合、内部で使われているローカルファイルアドレスなどは無視され、指定したBitmapが適用されます。
今回の最大の罠*2
・hoge:Objectに対して列挙する際、キーとなる名前は「メタセコイヤで材質でつけた名前」になる。
・Vixarで吐き出されたdaeのままだとキーの名前が随所で適用できない状況になっている。これが一番厄介。
どうやらBlenderで吐き出したばあいは問題になっていない人もいるようだ(ヴァージョン依存か???)。これはVixarで書き出すという簡単手法をとった場合に一番影響するので注意が必要。
1〜2、まず前回までの書き出しが終わったあと基本の読み込み。
[Embed(source="texture.png")] private var Mat_01:Class; [Embed(source="model.dae", mimeType="application/octet-stream")] private var MyObj:Class;
3、BitmapMateriakとしてObjectに列挙する
宣言
private var myMaterials:Object;
オブジェクトに入れる。
*この場合メタセコイヤで素材の名前がsozai01とつけていたと仮定する。
var Mat_01:Bitmap = new Mat_01() as Bitmap; myMaterials = { sozai01: new BitmapMaterial( Mat_01.bitmapData ) };
4〜5、第一引数にdaeファイルを、第二引数としてObjectを渡す
scene.addChild( new Collada( XML( new MyObj() ), new MaterialsList( myMaterials ) ) );
これでコード側はOK!
が!しかし!、ここからが問題です。
最大の罠 〜解決編〜
daeファイルをテキストエディタで開いてください。
library_materialsの中の material idと nameがメタセコイヤでつけた名前になっていることを確認。先ほど同じ名前にしていればOK
<library_materials> <material id="sozai01" name="sozai01"> <instance_effect url="#sozai01-fx"/> </material> </library_materials>
おそらくその上辺りに前回の手順で修正したファイル名の部分があるはずです。
さて、そのdaeファイルの中を素材名で検索してみてください。以下のような文章が見つかるはずですので修正します。
<triangles count="74" material="sozai01SG"> ↓ <triangles count="74" material="sozai01">
同じように以下のような文章を見つけて修正します。
<instance_material symbol="sozai01SG" target="#sozai01"> ↓ <instance_material symbol="sozai01" target="#sozai01">
複数のテクスチャが存在する場合、上記手順*枚数でそれぞれに対しての処理が必要です。
これでデバッグ状況でも実行できるようになるはずです。
以下参照したサイトです。サンプルがアップされていたのでdaeファイルの中身を見れて大変助かりました。
http://blog.flexcommunity.net/?p=16