« LAMPのライセンス | メイン | DrawTaskは毎回全登録 »

2005年09月24日

Teaspire 開発日誌:: D3DXのアニメーション

    

D3DXを使えばボーンのアニメーションは簡単に出来る。
サンプルもついているのでわかりやすい。
でも、カメラなどのアニメーションはどうやるのかよくわからない。
ってことでMultiAnimationサンプルとヘルプをひたすら追った。
サンプルではメッシュ内にアニメーションが定義されており、ファイルを読み込んだら勝手にアニメーションコントローラーがボーンと関連付けされ、アニメーションコントローラーの時間を進めれば自動的にボーンのマトリックスが更新されているっぽい。
初め、どこで誰がどうやって動かしているのかなぞだったが、ソースを見る限りはそのようになっているように思う。
つまり、D3DXのアニメーション機能はxファイルから読み込んだメッシュにのみ使えるのかとも思ったが、インターフェイスを見る限りアニメーションのキーを登録できたりしている。
カメラのアニメーションは独自実装にするかなと思ったが、さらにいろいろと調べるとID3DXAnimationController::RegisterAnimationOutput というメソッドを発見。
このメソッドによってアニメーションの出力を設定するようになっているようだ。
D3DXLoadMeshHierarchyFromX を使って読み込んだ場合はすべて自動的に登録されるとある。
つまり、こいつでカメラの回転と移動を設定してやれば、D3DXのアニメーションコントローラーが使えそるようだ。

とりあえず、使えそうなことはわかったが、そのためのデータをどうやって作るのかが良くわからない。
D3DXCreateKeyframedAnimationSet でキー フレーム アニメーション セット を作り、ID3DXKeyframedAnimationSet::RegisterAnimationSRTKeys で各キーフレームのスケーリングや回転などの設定が出来、ID3DXAnimationController::RegisterAnimationSetでそのアニメーションセットを登録してやれば、アニメーションコントローラーで操作できそうなことはわかる。
が、各キーの時間はどこで設定する?
D3DXCreateKeyframedAnimationSet の引数TicksPerSecondで1 秒間に経過するキー フレーム ティックの数を設定できることはわかる。
が、ティック値はどこで設定するのだ?
と思いながらヘルプを見ていたら、ID3DXAnimationController::RegisterAnimationSetの引数で指定するスケーリング値の配列がD3DXKEY_VECTOR3とかってなってた。
で、これは
typedef struct _D3DXKEY_VECTOR3 {
FLOAT Time;
D3DXVECTOR3 Value;
} D3DXKEY_VECTOR3, *LPD3DXKEY_VECTOR3;
と定義されている。
なんだ、そう言う事か。

これでアニメーション関連で疑問だったことが解決した。
独自で作ってもたいした事ないが、やっぱりD3DXを使っておいた方が何かといいだろう。(独自の方が良いことも多いけど……)

マテリアル値やライトのアニメーションをさせたい時は独自にするか、Vector3などで代用すればいいかな。
ま、かなり先だろうし初めは実装しないだろう。



投稿者 Takenori : 2005年09月24日 19:38




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