LightwaveからColladaファイルを書き出すよ


おまっとさんでございます。
こんなニッチなエントリーに興味を持ってくれる方人が居るようなので、書き出し方法を説明するよ!

大雑把に説明すると、Lightwave → DirectX形式 → Unwrap3D → Collada形式 という手順で行います。



Lightwave3Dの9.6にはColladaExportが追加されていて、これで書き出せる!と思っていたら無理でした。

正確に言うと、アニメーションしないデータならUVテクスチャ付きで書き出せます。というか、Lightwave上のアニメーションの有無に関係なく、アニメに関するデータが書き出されていません。用途にもよりますが、アニメなしのデータを構造体にすれば、まあロボットみたいなものなら表示できるんでしょうが、キャラクターなどのボーンが入った入ったモデルならば、そもそもの頂点データがどう変化したかを書き出せないと意味がありません。

というわけで、車のボディとか家とかを書き出せばいいやって人は、Lightwaveの9.6を使うとイイネ!


その1.準備しよう

作成に使ったのはLightwave3Dの7.5です。DirectXのエクスポーターさえ動けば、ほかのバージョンでもなんとかなるでしょう。

それ以外に必要なものは以下のような感じ。

  • Lightwave形式でアニメーションしてるデータ
  • Lightwave3DのDirectX Exporter
  • Ultimate Unwrap 3D
    (UV編集とかするソフト。いろんなデータを読み書きできて5000円くらい。SE版でイイヨ)

一番最後の「Unwrap3D」はキーの発行に1~2日くらいかかるので、すごく急いでいる人はご注意を。

※コレにたどり着くまで、結構いろいろなコンバーターを試してみましたけど、概ねぜんぜんダメだったので、これから他のソフトで人柱になろうという人はご連絡ください。試したことがあるやつかもしれません。


その2.モデルデータを整理しよう

まずはモデルの準備から。

なんでもいいので、ボーンが埋まってて動くデータをご準備ください。サンプルは昔作った何か。

モデル作成で注意するところは、

  • ウェイトの合計が100%を超えないように作ること
    (DirectXのデータとしてはNGぽい。ColladaならOKかも)
  • 三角ポリゴンにしておくこと(サブパッチ不可)

これくらいです。UVMapはちゃんと引き継がれるみたいです。三角ポリゴン化については、DirectXのプラグイン設定でも出来るんですが、Papervisionで使うような低ポリゴンのモデルは分割位置がモロに形に影響しますので、自分で割っておくのがよろしい。

テキトーなアニメーションを付けてレンダリングしたのはこんな感じ


その3.DirectX形式のデータを書き出そう

作ったデータをプラグインを使って書き出します。このとき、シーンデータは必ず複製しておいてください。DirectXのプラグインでIKの動作を出力したい場合、全フレームにキーフレームを作ってしまうので、オリジナルのデータをブチ壊します。危険なのでよろしくどうぞ。

書き出し設定はこんな感じ。

Exportタブ

「Export」タブはほぼチェックで。
DirectX8で、Text形式で書き出します。(生データを見てチェックする事があるかもしれません故)


このへんは適当に。


TextureタブでFlashに読める画像形式に変換しましょう。オリジナルが既にJpegとかで、そのまま使える場合にはここは不要。(絵がボケたら困る場合は、モデル作る段階でやっておくこと)


Animationタブは、カメラとライトは要らないのでチェック外します。IK使ってる場合はボーンにキーフレームを埋め込まないと動かないので、一番下をチェック。

設定できたらExportしましょう。
ポイントが飛び出したりしてうまくいかない場合は、頂点のウェイトが100%以外に設定されているポイントがないか調べてみるといいかも。


その4.Unwrap3Dで変換

ここまで出来たらあとは簡単。Unwrap3Dに読み込んでやります。

ここから、File > Save as… で Collada File(*.dae)を選んで書き出すだけ!
たぶんUV編集とかも出来るんじゃろうね。


その5.Papervisionに読み込んでみよう

あとは読むだけなんですけど、これにも地味な問題が3つほど。

1つ目は、Lightwaveでの座標系と、Collada上の座標系とで単位の概念が違っていて、モデルがものすごく小さく表示されてしまうんですね。まあCGソフト使ってると昔はよくあった話。
これはLightwave側であらかじめ大きくしておくか、Actionscriptでスケールしてやるかで解決。

2つ目は、ColladaのImageパスがうまく通らずにテクスチャが読み込めない場合。
これはテキストエディタでColladaファイルを開いてあげて、Libraly_imagesってタグの中身をゴニョゴニョやると解決。

3つ目はPapervision自体のリビジョン。デバッガで覗いてみると分かるんですが、微妙に古いのを使ってると、UVマップの値が全部0と1になってしまっていて、テクスチャ画像の左上1ピクセルしか表示されないのですね。これは知らないと結構ハマる。
Maxから書き出したオブジェクトは起こらない現象なので、たぶんオブジェクトの座標が小さすぎるのが原因じゃないかと。(主に推測)
そんな時にはできるだけ新しいのをリポジトリから取ってきて使いましょう。ちなみに私が確認したのはリビジョン876です。これより新しければ多分大丈夫。

じゃ、さっくり読み込んでみよう!

コードはこんな感じです。


package {
import flash.events.Event;

import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.parsers.DAE;
import org.papervision3d.view.BasicView;

public class Lightwave2Collada extends BasicView
{
public var dae:DAE;
public var target:DisplayObject3D;

public function Lightwave2Collada()
{
//変換したオブジェクト
dae = new DAE(true,null,true);
dae.scale = 300;
dae.load("export.dae");
scene.addChild(dae);

//カメラのターゲット
target = new DisplayObject3D();
target.y = 400;
scene.addChild(target);

camera.y = 800;
camera.target = target;

stage.addEventListener(Event.ENTER_FRAME, _enterFrameHandler)
}

private function _enterFrameHandler(e:Event):void{
dae.rotationY += 1;
startRendering();
}
}
}

うまくいきましたカナ?
「オレも出来た!」っていう人はお知らせ頂けるとうれしかったり。

当方、かれこれ15年くらいLightwave使ってるのでこんな面倒な手順踏んでますけど、普通にメインのツールがMaxの人は、ColladaMaxを使うと楽チンに書き出せるヨ!

ではでは。

コメントを残す