2011年4月アーカイブ

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ファイルにそれらを含めて書き出せるようになります。

前回Alternativa3D(A3D7.7)でJiglibFlashを使えるところまで行ったので、今回はキャラクタ用コリジョンを作ってみます。

最初に考えていたのは、回転しないようにした縦長のカプセルコリジョンを作って歩く方向に力を加えていくものだったんですが、実際やってみると設定が悪いせいか動くカプセルの衝突判定がなんだかおかしい。他のボックス・球・カプセルとぶつかった時にピクピクしたり簡単にすり抜けたり。設定で何とかならないか色々試してみたもののなかなか改善できなかったので、結局動くカプセルはなるべく使わないようにする事にしました。カプセル以外のコリジョンが動かないカプセルにぶつかったときは問題なかったんだけどね。

色々と試行錯誤しつつ決めたキャラクタの処理

  • 回転しない球体コリジョンを用意する。
  • 必要ならキャラクタのメッシュと連携させる。一人称視点ならコリジョンだけで。
  • キー入力で前後左右に移動。ジャンプもできるようにする。
  • 必要ならマウスドラッグで視点を動かす。
  • キャラクタの視線ベクトルと垂直ベクトルの外積で水平横方向のベクトルを作り、そこから水平前方向のベクトルも作って前後左右の移動処理に使う。
  • 視線が真上か真下を向いていると上記の計算ができなくなるので角度は制限する。
  • 自分のコリジョンが周囲のコリジョンとぶつかっているか、どの角度で触れているかをチェックして、ジャンプできるか判定する。(空中や絶壁でのジャンプをさせないため)
  • 摩擦があると壁に接触した状態でのジャンプが難しいため0にする。その代わり毎フレーム水平方向のみ移動量を減退させて摩擦っぽくさせる。
  • 摩擦を0にした事でちょっとした坂もずるずる滑ってしまう為、足元がゆるい傾斜+接地中のみ無重力にして滑らないようにする。


1  2