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週間もかかって!)、プログラムの使い勝手が悪くテストが思うように進みません。もう少し使い勝手をよくして再トライしていと思います。
でも、誰か頭の良い人がぱぱっと作ってくれないかなぁ…(チラッ
[TOHO MMD]GIRLS SALON
kanata式 東風谷早苗モデル
初めてつくられたモデルだそうですが、とてもそうとは思えないぐらいよく出来た可愛らしいモデルです。
さっそくえっちいことをお願いしようとしたのですが、健康的に可愛いモデルですので今一つそういうえっちなシチュエーションが思い浮かびません。
それならば背景をどうにかしてしまえと桃色の談話室を作ってみました。
余りこういう場所は詳しくないのでネットで検索したりしてみたのですが、細かいところの資料は集まりませんでした。
半分ぐらいは想像が入っています。
そしてテスト用にちょっとしたPVムービーを作ってみました。
この手の動画は作ったことが無く勝手がわからないので、ダンスもカメラもほとんど流し込みです。
それだけでは申し訳ないので、賑やかしに背景にモブのつもりでつけてみたら収集が付かなくなってしまいました。
軽く作るつもりだったんですが。でも結局力尽きて(飽きて)細かい部分の修正はやっていません。いつものことですね!
それにしても接点のない3人・・・
ステージデータはいくつか気になるところがあるので公開は躊躇っています。というより動画を作ってみていくつか見つけました。
普段あまり法線を意識してモデリングしていないので、エフェクトをつかうと色々と問題が出てきますね。
ファ○リースは透明にしたいのですけどどうすれば良いのでしょうか。勉強しないといけない事はたくさん出てきます。
初めてつくられたモデルだそうですが、とてもそうとは思えないぐらいよく出来た可愛らしいモデルです。
さっそくえっちいことをお願いしようとしたのですが、健康的に可愛いモデルですので今一つそういうえっちなシチュエーションが思い浮かびません。
それならば背景をどうにかしてしまえと桃色の談話室を作ってみました。
余りこういう場所は詳しくないのでネットで検索したりしてみたのですが、細かいところの資料は集まりませんでした。
半分ぐらいは想像が入っています。
そしてテスト用にちょっとしたPVムービーを作ってみました。
この手の動画は作ったことが無く勝手がわからないので、ダンスもカメラもほとんど流し込みです。
それだけでは申し訳ないので、賑やかしに背景にモブのつもりでつけてみたら収集が付かなくなってしまいました。
軽く作るつもりだったんですが。でも結局力尽きて(飽きて)細かい部分の修正はやっていません。いつものことですね!
それにしても接点のない3人・・・
ステージデータはいくつか気になるところがあるので公開は躊躇っています。というより動画を作ってみていくつか見つけました。
普段あまり法線を意識してモデリングしていないので、エフェクトをつかうと色々と問題が出てきますね。
ファ○リースは透明にしたいのですけどどうすれば良いのでしょうか。勉強しないといけない事はたくさん出てきます。
[TOHO MMD]KEINE LOVES HER STUDENTS. SIDE-B
忙しいのと嫌なことが続いているのでストレス解消にちょっと動画を作成です。
本当は以前に作成した即興動画をリファインしロング版にしてアップロードしようと考えていたのですが、うっかりモーションを保存し忘れて意気消沈。それならばと昨年に覗き風動画としてアップロードした動画の元ネタを引っ張りだしてきて本来のカメラ視点で動画を作ろうとしましたが、修正しようとモーションデータを見ると手が付けられない酷い有様。
仕方が無いので見られないところは適当に作った別シーンを挟んでパッチワーク的に仕上げました。見る方には不親切ですね!
けーねがペタンと座ってるポーズはアフィリエイトで目に付いた金剛さんのフィギュアポーズを適当に拝借してるのデース。
とまぁ、余計にストレスがたまったようにも思いますが動画を上げたら仕事に戻ります。
ああっ アップロードした動画を見たらカクカクしてシーンの切り替えが見づらい。
エンコードが悪かったのかな。このあたりは難しくてよく判りません。
時間ができたら調べなくてはです。
[広告 ] VPS
本当は以前に作成した即興動画をリファインしロング版にしてアップロードしようと考えていたのですが、うっかりモーションを保存し忘れて意気消沈。それならばと昨年に覗き風動画としてアップロードした動画の元ネタを引っ張りだしてきて本来のカメラ視点で動画を作ろうとしましたが、修正しようとモーションデータを見ると手が付けられない酷い有様。
仕方が無いので見られないところは適当に作った別シーンを挟んでパッチワーク的に仕上げました。見る方には不親切ですね!
けーねがペタンと座ってるポーズはアフィリエイトで目に付いた金剛さんのフィギュアポーズを適当に拝借してるのデース。
とまぁ、余計にストレスがたまったようにも思いますが動画を上げたら仕事に戻ります。
ああっ アップロードした動画を見たらカクカクしてシーンの切り替えが見づらい。
エンコードが悪かったのかな。このあたりは難しくてよく判りません。
時間ができたら調べなくてはです。
[広告 ] VPS
ミノさん
Oculus Rift と IK
ここ数日は Oculus Riftを被っていません。何をしていたかというと、MMD for Unity に使えそうなIK構造を模索していました。
MMD関連ツールのIKの仕組み自体はMMDを除いて統一は取れているのではないかと思います。ただIK自体は問題は無くても、ボーンの構造やIK同士の組み合わせや実装によって、あるツールで作ったモーションを別のツールに持っていく、思った通りの変形をしない事が多いです。
ツールとしてはやはり元祖である MikuMikuDanceが一番好きなのですが、モーションをツール間で引越ししたりすることを考えると、MMD for Unityで使うモーションはMMMで作成する事にしました。
今のところ MMD for Unityで使用するボーン構造は次のようにしています。
こうやって作成したモーションをUnityに持っていくのですが、それでも思ったような動作をしない事があります。今回の手コキモーションもそうですが、顔が思った角度で傾いてくれませんでした。Unity側でモーションを直そうかとも思いましたが、それも管理が大変ですのでうまく動かなかったIKの部分だけをFKに変換します。IKをFKに簡単に変換してくれるツールがあれば良いのですが、いくらググっても見当たりませんでしたのであきらめて手動でベイクすることにします。
方法は単純で泥臭く、そしてたいへんな手間がかかります。
まず対象モデルのベイクしたいボーンに、XYZの3方向に軸が伸びたガイド用オブジェクトをくっつけます。
次にこのガイド用のオブジェクトがくっついたモデルをMMMに2つ読み込んで同じモーションを適用し、片方はIKを有効にし、もう一方はIKを無効にしこれを作業用とします。
あとはひたすら、IK有効のモーションのボーンの回転にガイドオ用ブジェクトの3軸をぴったり合うようボーンを回転させていく作業です。
もしかしたらIKのキーフレームが打たれたフレームだけ位置を合わせるだけでもなんとかなるかな?と思いましたがダメでした。原理を考えれば自明なのですが理想は全てのフレームに対して位置を合わせる事です。ただ、それはサスガにやってられませんので4,5フレーム単位で合わせることにしました。結果はこんな感じです。
一番右がIK有効としたオリジナルのモーション。真ん中がその主要なボーンの軸とボーンを表示したモデル。左が手動でベイクしたモーションです。こんな300フレームもない単純なモーションで、ベイクしたのは首と頭だけなのですがかなり時間がかかりました。
手直しが発生した場合のことも考えるとちょっと現実的ではないですね……。
変換するツールが無いと書きましたが、実のところ MMD for Unity に MMDIKBakerというものが同梱されています。これで巧く行けば良いですが……経験的に変換したモーションはかなり手直ししないといけないので結局は手動でベイクするのと変わらないようにも思えます。
あともうひとつ気になるのが mmm ではフレーム単位でIKをオフできる機能があります。実際にIKをオフにしてみるとその時点でのリンクボーンがベイクされて登録できるように見えます。もしかしてこれが使えるのではと思うのですが、今一つよく使い方が判りません。mmmにベイク機能が付いてくれると一番いいのですけどね。
今回使用したガイドオブジェクトをくっつけるスクリプト。使うことはないかもしれませんが、PMDEditor用のCSScriptを公開されている人は少ないようですので、何かの参考になればと貼り付けておきます。
ガイド用オブジェクトをボーンにくっつける「AddGuideObject」。ガイド用オブジェクトの軸を合わせるときに邪魔となるのでモデルを透明化するモーフ「CreateInvisibleMorph」。そして透明化してガイド用オブジェクトだけが浮いていてもどのボーンの軸なのかが判りにくいので、ボーン構造だけを可視化する「DrawBone」の3つセットです。
プラグイン化するほどのものではないので、PMDEditorのCSScriptエディタ簡易形式にぺたりとコピペして、パラメータを適宜書き換えて実行します。
さて、こんな手作業をやっていると大変なので、半自動的にベイクできないかもう少し調べてみたいと思います。
[PMDE]ガイドオブジェクト
MMD関連ツールのIKの仕組み自体はMMDを除いて統一は取れているのではないかと思います。ただIK自体は問題は無くても、ボーンの構造やIK同士の組み合わせや実装によって、あるツールで作ったモーションを別のツールに持っていく、思った通りの変形をしない事が多いです。
ツールとしてはやはり元祖である MikuMikuDanceが一番好きなのですが、モーションをツール間で引越ししたりすることを考えると、MMD for Unityで使うモーションはMMMで作成する事にしました。
今のところ MMD for Unityで使用するボーン構造は次のようにしています。
- 腕IK
- IKMaker で作成したPMD形式準拠のIKです。シンプルな構造ですのでツール間の互換性は高いようですね。自作のスクリプトやIKMakerXで作成されるIKは回転付与を使用しますが、こういったPMXから増えた機能を使用した構造では、他のツールで巧く動作しない事が多いようです。
- 多段ボーン
- 適当な関節の子側にボーンを作成します。基本的な仕組みですのでこれがツール間で誤動作することはないと思います。
- 顔IK
- 私の好みでは上半身も顔IKに含めたかったのですが、上半身は腕のIKとも干渉しますので正しく動作しませんでした。今は諦めてリンクは首と顔だけにし、補助的に多段ボーンを使用することにします。私は多すぎる多段ボーンは管理しきれないので使いませんが、今回は仕方が無しです。顔IKに上半身を含めるのを諦める代わりに上半身系と下半身系を多段化することにしました。頭と首も一段ずつ多段化しています。
こうやって作成したモーションをUnityに持っていくのですが、それでも思ったような動作をしない事があります。今回の手コキモーションもそうですが、顔が思った角度で傾いてくれませんでした。Unity側でモーションを直そうかとも思いましたが、それも管理が大変ですのでうまく動かなかったIKの部分だけをFKに変換します。IKをFKに簡単に変換してくれるツールがあれば良いのですが、いくらググっても見当たりませんでしたのであきらめて手動でベイクすることにします。
方法は単純で泥臭く、そしてたいへんな手間がかかります。
まず対象モデルのベイクしたいボーンに、XYZの3方向に軸が伸びたガイド用オブジェクトをくっつけます。
次にこのガイド用のオブジェクトがくっついたモデルをMMMに2つ読み込んで同じモーションを適用し、片方はIKを有効にし、もう一方はIKを無効にしこれを作業用とします。
あとはひたすら、IK有効のモーションのボーンの回転にガイドオ用ブジェクトの3軸をぴったり合うようボーンを回転させていく作業です。
もしかしたらIKのキーフレームが打たれたフレームだけ位置を合わせるだけでもなんとかなるかな?と思いましたがダメでした。原理を考えれば自明なのですが理想は全てのフレームに対して位置を合わせる事です。ただ、それはサスガにやってられませんので4,5フレーム単位で合わせることにしました。結果はこんな感じです。
一番右がIK有効としたオリジナルのモーション。真ん中がその主要なボーンの軸とボーンを表示したモデル。左が手動でベイクしたモーションです。こんな300フレームもない単純なモーションで、ベイクしたのは首と頭だけなのですがかなり時間がかかりました。
手直しが発生した場合のことも考えるとちょっと現実的ではないですね……。
変換するツールが無いと書きましたが、実のところ MMD for Unity に MMDIKBakerというものが同梱されています。これで巧く行けば良いですが……経験的に変換したモーションはかなり手直ししないといけないので結局は手動でベイクするのと変わらないようにも思えます。
あともうひとつ気になるのが mmm ではフレーム単位でIKをオフできる機能があります。実際にIKをオフにしてみるとその時点でのリンクボーンがベイクされて登録できるように見えます。もしかしてこれが使えるのではと思うのですが、今一つよく使い方が判りません。mmmにベイク機能が付いてくれると一番いいのですけどね。
今回使用したガイドオブジェクトをくっつけるスクリプト。使うことはないかもしれませんが、PMDEditor用のCSScriptを公開されている人は少ないようですので、何かの参考になればと貼り付けておきます。
ガイド用オブジェクトをボーンにくっつける「AddGuideObject」。ガイド用オブジェクトの軸を合わせるときに邪魔となるのでモデルを透明化するモーフ「CreateInvisibleMorph」。そして透明化してガイド用オブジェクトだけが浮いていてもどのボーンの軸なのかが判りにくいので、ボーン構造だけを可視化する「DrawBone」の3つセットです。
プラグイン化するほどのものではないので、PMDEditorのCSScriptエディタ簡易形式にぺたりとコピペして、パラメータを適宜書き換えて実行します。
さて、こんな手作業をやっていると大変なので、半自動的にベイクできないかもう少し調べてみたいと思います。
[PMDE]ガイドオブジェクト