だ、である口調ですすめる。
Collada のコンバータの作成ということで
Blender で適当なモデルを作成し Collada を出力、出力した Collada を確認する。
ここのところこういったことを繰り返しやっている。
気づいたことに Blender 2.63 の時点ではまだ Collada ファイルに Physics データは出力されないらしい。
情報元はこちら↓
http://wiki.blender.org/index.php/Doc:2.6/Manual/Data_System/Files/Import/COLLADA
ただ、今後対応する予定と見ている。(筆者の憶測だが…)
2.6系の完成頃には備わっているのではないだろうか?(2013/6月ころ?)
パッチを当てると現在でも対応できると書いてあるが、パッチの入手場所と当て方を簡単に調べるも
面倒な手順が必要だったのでパスすることにした。
正式対応を待つ。(その前に自分のエディタで編集できるようにする。)
機能が備わった時に、コンバータをいじるだけで済むよう
描画の方で必要と思われるデータだけ格納できるよう独自フォーマットを決めることにした。
これまで何回かモデルデータのフォーマットを策定しようとしていたのだが
こうした物理情報を入れるか入れないかでいつも手が止まってしまうのだ。
Blender から設定できる物理パラメータのいくつかを設定できるようにしておけば良い感じか?
では Excel を開いて、思うままフォーマットを定めてみる。
いろいろツッコミを食らうと後で変更したくなるので詳細は示さないが
調査後に考えたフォーマットは次に示すイメージになった。(Excelシートの縮小イメージ)
マルチマテリアル、スキンメッシュに対応している。
エフェクトファイルとイメージファイルをパックしているので
描画時に関連ファイルを用意する必要はない。
さて、コンバータを修正してこのフォーマットでファイル出力するよう修正する。
7/1
C# はブロックリードしたデータブロックを構造体でキャストするということができない…
もちろんオフセットをリマップ(アドレスに書き換え)して利用することもできない。
フォーマットのオフセット情報はいくつかインデックスに書きなおす必要がありそうだ。
あと、階層構造を考えていた部分は子ノードの数+先頭子ノードのオフセットとするより
兄弟ノードのインデックス、子ノードのインデックスとするのが良いかと思う。
(ノードの作成、格納時に子が必ず連続しなければならないルールで書き出すコードはメンテが難しいため)
インデックスの初期値は0としたいけど、普通にインデックス0はあり得る…どうしよう。
uintとしていたがintとして、0より低い値で無効なインデックスとする。
どうしてもuintを使う場面ではヘッダ情報から確かめる。
7/25
とりあえずコンバータがファイルを書き出すようになった。
書き出したファイルを読み込んでバイナリデータを復元する機構も用意、簡単な動作確認まで完了。
さて、ひとまず次のようなデータフォーマットに落ち着いた。
きっとツッコミどころ満載なので、詳細は載せないことにする。
では読み込んだデータを表示するだけの簡単なビューアを用意してみる。
ここまで示してきたとおり、C# + WPF + SharpDX で作る予定。
詳細は、次回お楽しみに!
なんだか寂しいページになったので、作成したバイナリデータクラスと
ライターとリーダー、コンバーターを次に示す。
興味なければ読む必要はない。(むしろ読むな。)
Collada からどうやって頂点バッファを作成するのか気になる人が
読むと何かの役に立つ可能性があるだけだ。
一番時間をかけた、変換部のコードが次のファイル
座標系変換や、文字コードの変更には未対応。
2012/06/29 初記。
2012/07/25 更新。