8 月 14 2008

PV3Dでレースゲーム制作 10 - 3Dモデル埋め込み編

Posted by tanjo at 11:14 PM

今までは何も考えずCollada生成のタイミングでDAEファイルにアクセスしていましたが(下記ソース)、これだと描画までに妙なタイムラグができてしまい、ウェブ公開向きの状態ではありませんね。

//3Dモデル作成
courseObjects = new Collada("assets/md_course01.dae");

対処としては、モデルデータ自体をSWFに埋め込む方法と、モデルデータのローディングイベントを用意する方法の2つがあると思います。
今回はモデルデータ一式をSWFに埋め込む方法について。「一式」と書いたのは、DAE本体だけでなく、DAEが指定しているテクスチャの画像ファイルも一緒に埋め込む必要があるからです。

参考にしたサイト

それでは、手順を追っていきましょう。(ところどころ用語が間違ってたらすいません…。)
Papervision3D のマテリアルリストを使うので、まずはクラスをインポート。

import org.papervision3d.materials.utils.MaterialsList;

コンストラクタの前にCOLLADAとテクスチャを Embed しておきます。

[Embed(source = "embed/md_course01.dae", mimeType = "application/octet-stream")]
private var mdCourse01:Class;

[Embed(source = "embed/tx_main.jpg")]
private var txMain:Class;

[Embed(source = "embed/tx_tree.png")]
private var txTree:Class;

[Embed(source = "embed/tx_item.jpg")]
private var txItem:Class;

このようにテクスチャ画像が複数あるときは、すべて Embed しておく必要があります。
ちなみに Loader とかで読み込むファイルはSWFのパスが基準、一方 Embed はソースの場所が基準になります。作業ディレクトリを分けてるときは要注意です。

次にマテリアルの作成。

var txMainBitmap:Bitmap = new txMain() as Bitmap;
var txTreeBitmap:Bitmap = new txTree() as Bitmap;
var txItemBitmap:Bitmap = new txItem() as Bitmap;
var mdCourse01Materials:Object = new Object();
mdCourse01Materials = {
	t_all_jpg:new BitmapMaterial(txMainBitmap.bitmapData),
	t_all_jpg_2:new BitmapMaterial(txMainBitmap.bitmapData),
	t_tree_png:new BitmapMaterial(txTreeBitmap.bitmapData),
	t_item_jpg:new BitmapMaterial(txItemBitmap.bitmapData)
};

Embed 時に作成したクラスから、Bitmap インスタンスを作成します。そしてこれらを元に、マテリアル用の Object に BitmapMaterial を登録していきます。
ここで注意点!Object のキーは、COLLADAのマテリアル名を使います。(赤文字部分。記述は順不同でOK。)
ですので、もしマテリアル名に妙な記号とか2バイト文字とかが入ってる場合は、あらかじめCOLLADAを修正しておかなければなりません。
マテリアル名は、Blender(COLLADAインポート)ではアニメーションビュー、球体アイコンで確認できます。

COLLADAのXML内では material タグに定義されています。

<library_materials>
	<material id="t_all_jpg" name="t_all_jpg">
...

ただしここ以外の場所からもid名を参照していたりするので、手作業で名前を変更するときは、検索してそれらを一括で変えてあげないとダメかもしれません。

さてASに戻り、最後に3Dオブジェクト作成。記事冒頭のソース部分の置き換えです。

courseObjects = new Collada( XML(new mdCourse01()), new MaterialsList(mdCourse01Materials) );

Collada() メソッドの第1引数にモデルクラスのインスタンスを XML にキャストしたもの、第2引数に先ほどの Object から作った MaterialsList を指定すればOK。Collada() に直接DAEファイルを指定したときと同じ物が生成されるはずです。

あとはいつもどおり、Collada を Scene3D に addChild して、renderScene で描画するだけ。(→参照
今回はゲーム的には進展なしなので、デモとかはありません…!

Leave a Reply