« Xファイルコンバーター拡張 | メイン | ゴールオブジェクトは残す? »

2005年03月13日

Teaspire 開発日誌:: Xファイルからボーンリンクの読み込み

    

Xファイルではフレームと言う単位でデータが階層化されている。
ボーンの情報は ID3DXSkinInfo インターフェイスで得られる。
だが、ボーンのリンク構造をどのように得るのかわからず、フレームのツリー構造を利用していろいろとやって取得することが出来たが、この文書を書く前にID3DXSkinInfo とサンプルソースを確認してみたら、ConvertToBlendedMesh で得られる D3DXBONECOMBINATION 配列へのポインタを使えばリンクを得られるよう。
D3DXBONECOMBINATION にはBoneId 配列へのポインタがあるので、これを使えば・・・ あれ? 無理かな? 出来ないかも。
やっぱり、フレームのツリー構造を利用する方法でないとダメそう。
サンプルソースでは、フレームの結合済み行列へのポインタをポーンへ代入している。
つまり、まずはフレームの階層を走査して結合済み行列を作り、ボーンリストと同一属性(同時に描画できる)頂点リストを利用してトランスフォームするということか。
ボーンには結合済み行列へのポインタがあるので、ボーンリストとウェイトから行列をブレンド出来る。
なんだ、フレームのツリー構造を使う方法で良さそうだ。

まず、スキン情報の入った D3DXSKININFO を得る。
D3DXSKININFO のボーンリストからボーン名リストを作る。
ボーン名リストは、そのフレームがボーンかどうかを判定するのに利用する。
つまり、ボーン名リストに名前があればボーン、なければボーンでないと言うこと。
フレームを走査して、フレームにボーンかどうかのフラグをつけると同時に親へのポインタを保持する。 (ボーンフラグは別になくてもいいのか。毎回ボーン名リストから判断すれば。親も毎回走査することで得られるけど、それはちょっとしんどい。)
フレームを幅優先で走査して、親がボーンで自分もボーンのものを親の子供として追加する。
って、別に幅優先じゃなく深さ優先でも、親ボーンにaddBoneするのならいいのか。
Modelがボーンリスト持っていて、Modelからボーン検索して、見つかったボーンに子供を追加するだけだし。
わかりやすいようにファイルへ書き出して見てみるのに幅優先が必要だったからそうしたけど。
まあ、幅優先でいいか。スタックの心配が少ないし。



投稿者 Takenori : 2005年03月13日 07:05




comments powered by Disqus
Total : Today : Yesterday : なかのひと