barusan.jpg
Flashはアルファを含んだ画像やシェイプを重ねすぎると表示がおかしくなったり極端に重くなったりするので、拡大縮小回転しつつたくさん重ねる場合は処理の重いBitmapData.draw()を使うしかなかったんですが、FP11のStage3Dではそんな心配もいらないみたいです。

上のデモは透過画像を重ねまくる事になる煙パーティクルの負荷テストです。例によって3Dライブラリを作れるスキルはないので、Alternativa3Dにお世話になりました。煙画像のSprite3Dをぶわーって吐きだしてるだけです。
自分の環境ではパーティクル数1300でギリギリ60fpsくらい。もっと表示できると思ってたんだけど、これはSprite3Dに割り当てた透過画像が重いって事なのかな。それでも以前は100個くらいが限界だったので大分軽くなってると思うけど。

完全に忘れてた

そういえば以前PV3Dで某エースコンバット的なものを作ろうとしてて・・・というかほぼできてたんだけど、これは雲とか3DモデルのほとんどをBitmapData.draw()で描画してました。雲の塊用ビューポートを空にたくさん浮かべて、カメラからの距離で雲の解像度とレンダリング頻度を調節したりと結構めんどい処理をしていたわりに速度が出なくて悲しかった。。。これA3D8で作り直したいな。

flight002.jpg

flight001.jpg

OpenCOLLADAで書き出すCOLLADAファイルにはオブジェクトごとに設定したユーザー定義プロパティを含める事ができます。

ユーザー定義プロパティっていうのは、モデリングソフト等で↓こんな感じにオブジェクトごとに自由に設定できるデータで、自分はA3D+Jiglibでコリジョン設定をする際に剛体のパラメータに使おうかなって思ってました。
userdefwin.png

※書き出し時に赤枠の所にチェックを入れるとユーザー定義データが含められる
userprop.png

ただ、Alternativa3D7.7がユーザー定義データをパースしてくれているかがちょっとわからなくて。Object3Dにそれっぽいパラメータが見当たらなかったから多分パースしてないのかな?

よくわからないので、ユーザー定義プロパティだけをパースするクラスを作ってみました。

3dsMaxでモデリングしたものをOpenCOLLADAで書き出して、A3D7.7のCOLLADAパーサで表示すると、時々モデルの大きさや位置がおかしくなっている事があります。

最初はOpenCOLLADA側のバグかなと思っていたんですが、書き出したDAEファイルをPV3Dでは問題なく表示できていたので、A3DのCOLLADAパーサ側の不具合かもしれません。(PV3DのCOLLADAパーサにも一部不具合があるようだけど)

モデルのパースがうまくいかない原因ははっきりしていないんですが、なんとなくスケールや回転を何度か弄ったり、基点を動かしたりするとうまくいかない気がします。

とりあえずの対処法

うまくパースできなかったモデルの基点をリセットしてみる
parseerror1.png

それでも駄目だった場合もしくは基点をリセットしたくない場合


  1. 適当なオブジェクト(以下 T)を作る。Boxとか。
  2. Tを編集可能ポリゴンに変換
  3. Tを位置合わせ機能でうまくパース出来ないモデル(以下A)と同じ位置にする
  4. 必要なら回転も合わせる
  5. TにAをアタッチする(AがTの一部になる感じ)
  6. Tだけを選択して削除
これでだいたいうまくいくはず・・・たぶん。編集可能ポリゴンにアタッチするのでAがモディファイヤを色々適用してた場合は全部統合されちゃうけどね。
最近は3dsMax2010で作ったモデルをA3DプラグインでCOLLADA書き出しする事が多いんですが、書き出し時にエラーが出てMaxが落ちてしまう事が時々あって困っていました。

色々と調べていくつか原因が特定できたので書いておきます。
※あくまで自分の環境で発生したものです。

  • 同じシェルマテリアルを複数のオブジェクトに貼っているとエラー
  • デイライトでサンライトをmr Sunに設定したものをシーンに配置しているとエラー

シェルマテリアルはレンダーベイキングの記事で説明したマテリアルです。シェルマテリアルを複数モデルで共有する事ってあまりなさそうですが、モデルの一部をデタッチしてわけたりすると2つのモデルに貼っている事になってしまうかもしれません。一応これはシェルマテリアルを複製して貼り直す事で解決できます。

デイライトの方は非表示にしたりして書き出し対象になっていなくてもエラーが出てしまうので、サンライトパラメータでmr Sunを選ばないようにするか、書き出す時に一時的にシーンから削除するしかないのかな?他にいい方法が見つかったら追記します。
前回はキャラクタ用コリジョンを作って部屋の中を歩き回るデモを作りました。その部屋の中の見た目がやわらかい感じになっていますが、あれはモデリングソフトでオブジェクトに落ちる影や光をテクスチャに焼きつけているからです。一般的にはレンダーベイキングって言うのかな。今回は3dsMax2010を使って前回のシーンのようなテクスチャに影をベイクしたものを書き出すまでの手順を書いておきます。丁度今作っているモデルがあるので説明にはそれを使って行きます。

使った物

モデリングソフトには3dsMax2010を使いました。Alternativa3D(A3D)の3dsMax用プラグインが出ているのでCOLLADAの書き出しにはそれを使います。このプラグインを入れると、A3D専用オブジェクト(Sprite3DとLOD)が生成できるようになって、オブジェクトごとにA3D用プロパティ(ソート形式や透明度等)を設定してDAEファイルにそれらを含めて書き出せるようになります。

1  2  3  4  5  6