2ntブログ

Oculus Rift と IK

ここ数日は Oculus Riftを被っていません。何をしていたかというと、MMD for Unity に使えそうなIK構造を模索していました。


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方向に軸が伸びたガイド用オブジェクトをくっつけます。
blog2014020801.jpg

次にこのガイド用のオブジェクトがくっついたモデルをMMMに2つ読み込んで同じモーションを適用し、片方はIKを有効にし、もう一方はIKを無効にしこれを作業用とします。

あとはひたすら、IK有効のモーションのボーンの回転にガイドオ用ブジェクトの3軸をぴったり合うようボーンを回転させていく作業です。
blog2014020803.gif

もしかしたらIKのキーフレームが打たれたフレームだけ位置を合わせるだけでもなんとかなるかな?と思いましたがダメでした。原理を考えれば自明なのですが理想は全てのフレームに対して位置を合わせる事です。ただ、それはサスガにやってられませんので4,5フレーム単位で合わせることにしました。結果はこんな感じです。

blog2014020804.gif

一番右がIK有効としたオリジナルのモーション。真ん中がその主要なボーンの軸とボーンを表示したモデル。左が手動でベイクしたモーションです。こんな300フレームもない単純なモーションで、ベイクしたのは首と頭だけなのですがかなり時間がかかりました。
手直しが発生した場合のことも考えるとちょっと現実的ではないですね……。

変換するツールが無いと書きましたが、実のところ MMD for Unity に MMDIKBakerというものが同梱されています。これで巧く行けば良いですが……経験的に変換したモーションはかなり手直ししないといけないので結局は手動でベイクするのと変わらないようにも思えます。

あともうひとつ気になるのが mmm ではフレーム単位でIKをオフできる機能があります。実際にIKをオフにしてみるとその時点でのリンクボーンがベイクされて登録できるように見えます。もしかしてこれが使えるのではと思うのですが、今一つよく使い方が判りません。mmmにベイク機能が付いてくれると一番いいのですけどね。



今回使用したガイドオブジェクトをくっつけるスクリプト。使うことはないかもしれませんが、PMDEditor用のCSScriptを公開されている人は少ないようですので、何かの参考になればと貼り付けておきます。

ガイド用オブジェクトをボーンにくっつける「AddGuideObject」。ガイド用オブジェクトの軸を合わせるときに邪魔となるのでモデルを透明化するモーフ「CreateInvisibleMorph」。そして透明化してガイド用オブジェクトだけが浮いていてもどのボーンの軸なのかが判りにくいので、ボーン構造だけを可視化する「DrawBone」の3つセットです。

プラグイン化するほどのものではないので、PMDEditorのCSScriptエディタ簡易形式にぺたりとコピペして、パラメータを適宜書き換えて実行します。

さて、こんな手作業をやっていると大変なので、半自動的にベイクできないかもう少し調べてみたいと思います。

[PMDE]ガイドオブジェクト

コメントの投稿

非公開コメント

ヒェ〜、手間暇かかって大変ですな。頑張って下さい。

No title

こんにちは、外国のファンです。

ブログよく見ています。

Oculus Rift側の開発に興味のある人靭帯traceboxさんが開発をしたなんてとても嬉しいですね。

もしかしたらMMD4Mecanim pluginを使用してみたのですか?

私もモーション移植に問題が多く、悩んでMMD4Mecanimを使用してから非常に楽になりました。

 互換性を考えるなら、mmd for unityよりも送るといいと思い申し受けます。

Re: No title

コメントありがとうございます。

> Oculus Rift側の開発に興味のある人靭帯traceboxさんが開発をしたなんてとても嬉しいですね。
> もしかしたらMMD4Mecanim pluginを使用してみたのですか?
MMD4Mは数回、使用してみました。
MMD4UよりはUnity本来の形式に近いのかなという印象はありましたが、
Mecanimの使い方が今一つ判らず、そのままになっています。
もう一度挑戦してみる価値はありそうですね。

ありがとうございます^^
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Twitter