IKベイクふたたび
今年の初めごろにIKをうまくFKに変換できないかと頑張っていた話の続きです。
MMDのIKで作成したモーションを他のプラットフォームで再生すると、思ったように再生されなくて困ることがあります。
IKはターゲットの座標から各関節の回転をコンピュータが逆算して求めてくれるのですが、MMDではこの計算にいくつかの工夫や制約が入っていて、この計算を再現できなとうまくモーションが再生されないということになるようです。
では、どうすればよいか。IKで作成したモーションを一旦、IKなしの状態にしてから他のプラットフォームへ持っていこうというのがこれまでの試みでした。これをIKベイクと言うそうです。
IKベイクの方法で一番確実なのは、MMD自身が計算した各関節の回転情報を得る事です。MMDにはMME用にいくつかの情報が公開されているため、ここから情報が得られそうだとは漠然と考えていたのですが、私のスキルではどうやって手を付けて良いのか判らず手をこまねいていました。
ところが、最近になって以下の参考になるものを見つけて、私のスキルでもなんとか手が届きそうなところまで来たかなと考えはじめたところです。
参考1.わたりさんのMME
アクセサリ、ボーンの位置合わせ用エフェクト
便利なエフェクトセットのなかに、「IKオフに変換」というそのままズバリのIKベイクを行うエフェクトがあります。
中身を紐解くとベイクしたいIK関連ボーンにアクセサリを関連付け、その回転行列と、親ボーンからの相対回転を計算しているようです。
なるほど!IKのリンクボーンは回転情報を得ても回転0になるので、どうすれば良いのかと思っていましたがアクセサリをつけてあげれば、そのアクセサリから回転情報が得られるのですね!
どうしてその計算でその結果が得られるかは理解できませんが、計算してみるとたしかに思った結果が得られるようです。
ここは深く考えずに計算式を拝借する事にします。
参考2.ミーフォ茜さんのMMM用プラグイン
GetMmdTransformationPlugin
MMM用の便利なプラグインセットのなかに、MMDからポーズ情報を1フレームだけ取得してMMMに反映させるというものがありました。ソースコードを読んでみると、まさにMMDがMME用に公開している関数を参照しています。
私のスキルでは細部までわかりませんが、実装を真似てみると確かに情報が取得できます。
一部、アクセサリの情報取得関数の実装が欠落しているため少し修正する必要がありますが、ほぼそのまま流用できます。
あとは、ミーフォ茜さんのGetMmdTransformationPluginと同じやりかたでMMDのモーションを全フレーム分取得し、わたりさんの計算式を適用するだけでベイク完了・・・のはず。
というわけで検証してみました。
左が元のIKありモーション。右がベイクしたFKモーションです。足首が変な方向なのは未だベイクしていないからで、顔の角度が異なるのはボーン構造が異なるからですが、おおむね思ったようにベイクできているようです。ただ計算誤差なのかモデルを重ねると微妙にモーションが重なりません。
とりあえず本当にこの方法でIKベイクができるのか実現性検証のためにプログラムを書いたのですが(3週間もかかって!)、プログラムの使い勝手が悪くテストが思うように進みません。もう少し使い勝手をよくして再トライしていと思います。
でも、誰か頭の良い人がぱぱっと作ってくれないかなぁ…(チラッ
MMDのIKで作成したモーションを他のプラットフォームで再生すると、思ったように再生されなくて困ることがあります。
IKはターゲットの座標から各関節の回転をコンピュータが逆算して求めてくれるのですが、MMDではこの計算にいくつかの工夫や制約が入っていて、この計算を再現できなとうまくモーションが再生されないということになるようです。
では、どうすればよいか。IKで作成したモーションを一旦、IKなしの状態にしてから他のプラットフォームへ持っていこうというのがこれまでの試みでした。これをIKベイクと言うそうです。
IKベイクの方法で一番確実なのは、MMD自身が計算した各関節の回転情報を得る事です。MMDにはMME用にいくつかの情報が公開されているため、ここから情報が得られそうだとは漠然と考えていたのですが、私のスキルではどうやって手を付けて良いのか判らず手をこまねいていました。
ところが、最近になって以下の参考になるものを見つけて、私のスキルでもなんとか手が届きそうなところまで来たかなと考えはじめたところです。
参考1.わたりさんのMME
アクセサリ、ボーンの位置合わせ用エフェクト
便利なエフェクトセットのなかに、「IKオフに変換」というそのままズバリのIKベイクを行うエフェクトがあります。
中身を紐解くとベイクしたいIK関連ボーンにアクセサリを関連付け、その回転行列と、親ボーンからの相対回転を計算しているようです。
なるほど!IKのリンクボーンは回転情報を得ても回転0になるので、どうすれば良いのかと思っていましたがアクセサリをつけてあげれば、そのアクセサリから回転情報が得られるのですね!
どうしてその計算でその結果が得られるかは理解できませんが、計算してみるとたしかに思った結果が得られるようです。
ここは深く考えずに計算式を拝借する事にします。
参考2.ミーフォ茜さんのMMM用プラグイン
GetMmdTransformationPlugin
MMM用の便利なプラグインセットのなかに、MMDからポーズ情報を1フレームだけ取得してMMMに反映させるというものがありました。ソースコードを読んでみると、まさにMMDがMME用に公開している関数を参照しています。
私のスキルでは細部までわかりませんが、実装を真似てみると確かに情報が取得できます。
一部、アクセサリの情報取得関数の実装が欠落しているため少し修正する必要がありますが、ほぼそのまま流用できます。
あとは、ミーフォ茜さんのGetMmdTransformationPluginと同じやりかたでMMDのモーションを全フレーム分取得し、わたりさんの計算式を適用するだけでベイク完了・・・のはず。
というわけで検証してみました。
左が元のIKありモーション。右がベイクしたFKモーションです。足首が変な方向なのは未だベイクしていないからで、顔の角度が異なるのはボーン構造が異なるからですが、おおむね思ったようにベイクできているようです。ただ計算誤差なのかモデルを重ねると微妙にモーションが重なりません。
とりあえず本当にこの方法でIKベイクができるのか実現性検証のためにプログラムを書いたのですが(3週間もかかって!)、プログラムの使い勝手が悪くテストが思うように進みません。もう少し使い勝手をよくして再トライしていと思います。
でも、誰か頭の良い人がぱぱっと作ってくれないかなぁ…(チラッ