LAGライブラリを試してみるその4
自キャラがゲーム中で何種類もの武器を装備する場合は、自キャラの3Dモデルと武器の3Dモデルを別々に作成しておいて、
装備中の武器のボーン座標をキャラの手のボーン座標に合わせてやるというのをやればいい。
それが今回の実験。LAG公式サイトでいうsample6にあたるやつ。
GetWorldTransformsで好きなボーンの行列を取得
LAGライブラリのAnimationPlayerクラスの中に、好きなボーンの位置・回転情報を引き出すGetWorldTransforms命令があるので、
この命令で自キャラが武器を持つ「手」のボーン情報を引き出してやる。sampleではBip01_R_Handというのが手のボーン名らしい。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (worldmatrix.png)
で、その命令で取得したキャラの手のボーン情報を、武器を描画するための自作関数に渡してやるというわけ。
また関数を自作しなくてはならないのであまり良い気分はしないが、今回の関数の内容はモーションなしのただの3Dモデルを描画するだけのものなので、それほど難しくはなかった。たとえ難しく感じても一度関数をコピーしてしまえばあとはいじらなくていいんだから今だけの辛抱と考えるしかあるまい。これが描画関数。武器はモーションがないので基礎レンダリング命令だけでいい。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (modeldraw.png)
問題
プログラム的には、上の部分を追加するだけで任意ボーンへのコンストレインは完成するはずなんだが・・・・・・
実行すると、今回一番重要なところのGetWorldTransforms命令のところでエラーが出てしまった。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (error.png)
原因はRokDeBoneのボーンの名前にあった。RokDeBoneでは自分でつけたボーン名の後ろに隠れて自動的に_jointという文字が付加されるという法則が、RokDeBone公式マニュアルの方に書かれていたのだ。
試しにxファイルを文書形式で開いてみてボーン名のところ調べてみると、確かに自分でつけたボーン名の後ろに_jointと知らずについていた。
なのでプログラム側のボーン名指定に_jointがついた正しいボーン名を渡してやると、エラーは解消されて正常に動かすことができた。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (jointname.png)
もう1つの問題
もう1つ問題だったのが、コンストレインは正しくできているのに、武器の位置が自キャラの手元に合わないパターン。
モーションにはちゃんとついてきてくれるが、どうも位置が合わないという場合、RokDeBoneでボーン作成をしたときの
ルートボーンの位置がおかしかった恐れがある。画像では大剣が空中で振り回されてしまっている。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (nohand.png)
画期的な方法はありそうではあるが、とりあえずの解決策はRokDeBoneでのボーン作成時、武器と武器の柄にあたるルートボーンを
絶対座標の原点にあわせておけば良いということ。
画像のようにルートボーンの位置を適当に作ってしまうと、XNAに持ってきたときに、原点からのずれの情報までも一緒にもってきてしまうということになってしまうようだ。RokDeBoneの「位」の初期位置変更機能で、修正してやれば直せる。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (noorigin.png)
結果
いくつかプログラムを加えて、武器変更キーを押すと装備武器と攻撃モーションが変化するというのをやってみた。
手放した方の武器が空中に静止してしまっているが、今はゲームではないので気にしないことにするよ。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (movie.mp4)
で、今回の実験なんだが、どうもプログラム側の難点というよりは、RokDeBone2での修正問題の方が多かった。
プログラムの部分に大した問題がなかったのはありがたいといえばありがたいことなのだろうけど、
これはつまりモーション作成ソフトが違えば違うほど、モーションソフトの数だけ問題が起き得るということなので、各々で対処するしかないということになってしまう。
XNAやLAGライブラリの問題ではないからエラーが見つけにくい、とても不安定な要素だと思った。
RokDeBone2を使ってる人に限りこの実験記事が参考になると思うので、注意してね。
最終更新:2010年09月04日 21:58