Lightwaveでモデル作成 → BlenderでCOLLADA出力 → Papervision3Dでレンダリング、と練習してみます。
PV3Dやってみる(5) 【DAEデータを読み込み】 | [FlaTech+]WebDesign Rainyday を参考にさせていただきました。やりながら気づいたこと、つまずいた点とかを書いておきます。
モデルの作成
Lightwave Modelerで適当にモデルを作ります。
UV投影方式は Atlas にしました。
データインポート時にトラブルのもとになる(気がした)ので、UV名やサーフェス名は、半角英数のみ・記号なしの短いものにした方が無難です。ちなみにUVマップされていないサーフェスは、Papervision3Dで描画できないっぽいです。単純なモデルでもUVマッピングしましょう。
マップ画像の形式は、JPEG か PNG あたりにしておけば問題ないです。ちなみにPNGに透明色があると、その部分はPapervision3Dで描画したときに透明のテクスチャとして扱ってくれます。自動で。これは便利!
そして、そのままネイティブのLWOファイルとして保存。ファイル名も box.lwo とか無難なものに。
私は最新版のLightwave 9.3.1を使用していますが、このバージョンのLWOでも、Blenderはインポートしてくれました。
COLLADA形式での書き出し
あらかじめBlenderをセットアップしておきます。
Blender起動時に、すでに余計なモデルやライトが置いてある場合は、[A]キーを使って全選択 → [Delete] で削除できます。
File > Import > Lightwave (.lwo) から、先ほどのLWOをインポート。アニメーションモードに切り替え(下図)、ブラウザパネルで書き出すオブジェクトだけが選択されているか確認し、File > Export > COLLADA 1.4 (.dae) を選択します。
エクスポート設定はこのようにしました。

ポリゴンを三角分割する/選択部分だけ書き出し/UVマップを使用する、の3つにチェックしています。「Disable Physics」もチェックしていいかもしれませんね。
この時点で三角分割しても、テクスチャマッピングがずれる…なんてことはありませんでした/今のところは。でも多角形の分割はあまり利口ではなかったので、複雑な形状は、モデリングの時点である程度分割しておくべきかも。まあ当然ですかね。
*綺麗な分割でないと、Papervision3Dでポリゴン欠けやテクスチャ歪みが起こりやすいです。
これで、COLLADA形式のモデルデータが出力されます。
COLLADAはXMLで記述されたテキストファイルで、Google Earthなんかでも利用されています。拡張子は「.dae」。
さて、このまま利用してもとりあえずPapervision3Dでは使えますが、私の場合ではテクスチャ画像の参照を絶対パスで行っていたので修正しておきました。
DAEファイルをテキストエディタで開き、該当箇所を相対パスに変えておきます。
<init_from>f:\works\flashdevelop\pv3d\3dmodel_01\model\t_box.jpg</init_from> (修正前)
<init_from>t_box.jpg</init_from> (修正後)
(追記)
どうやらBlenderのエクスポートオプションで、「Use Relative Paths」をチェックすれば相対パスになるようです。
Papervision3DでCOLLADA表示
Papervision3Dでは、COLLADAを使用するためのクラスとして、
- org.papervision3d.objects.parsers.Collada;
- org.papervision3d.objects.parsers.DAE;
の2つがあります。
両者の違いは、ロードするときの書式だとか、拡張されたCOLLADA形式への対応状況だとか、オブジェクトのデフォルトサイズとかいったところ。note.xさんの記事にちょくちょくヒントが出ています。
使い方は、まずSWFが書き出されるディレクトリを基準に、COLLADAファイルとテクスチャ画像を移動。そしてスクリプトはこのような感じに。Colladaだと、
//クラスをインポート
import org.papervision3d.objects.parsers.Collada;
//宣言
private var colladaObj:Collada;
//定義して読み込む
colladaObj = new Collada("XXX.dae");
//Scene へ addChild
scene.addChild(colladaObj);
DAEだと、
//クラスをインポート
import org.papervision3d.objects.parsers.DAE;
//宣言
private var colladaObj:DAE;
//定義して読み込む
colladaObj = new DAE();
colladaObj.load("XXX.dae");
//Scene へ addChild
scene.addChild(colladaObj);
基本的な操作は、スクリプトで生成したPlaneとかと同様です。
なお私のモデルでは、同じファイルを扱ってもDAEの方がかなり小さく表示されてしまいました。そこで .scale を 100 に指定してやるとだいたい同じくらいのスケールに。
さてさて、これらをもとにサンプルを作ってみました。
*ソースファイル Main.as の全文はこちらから参照できます。

技術ネタ |
3d, blender, lightwave, papervision3d |