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]ガイドオブジェクト
Oculus Rift 試行錯誤
ここしばらくはOculus RiftとUnityで遊んでいます。
Oculus Rift用にいくつかモーションを作っては見たのですが、配置の難しさに苦しんでいます。
たとえば手コキモーションを作ってみたのですが、カメラ位置をプレイヤー頭部においたときに女性モデルの全身が眺めまわせるようにモーションを作るのが苦労します。
これで大丈夫かな?と思っても実際に覗いてみると、女性モデルの頭が邪魔で何をしているのか判らなかったり。
それはそれで臨場感はあるのですが、折角のモデルが見えないと勿体ないですしね。
これも配置やパラメータを修正してもうまくいかなかったら没かもしれません。
もう少し計画的に配置とモーションを設計した方が良いかなとも思いますが、どうせ設計通りにはなりませんので。
あと立体度が強すぎるようにも思えるのですが、視差はどのパラメータを設定すれば良いのでしょうか。一度ちゃんとマニュアルを読まないとダメですね。
Oculus Rift用にいくつかモーションを作っては見たのですが、配置の難しさに苦しんでいます。
たとえば手コキモーションを作ってみたのですが、カメラ位置をプレイヤー頭部においたときに女性モデルの全身が眺めまわせるようにモーションを作るのが苦労します。
これで大丈夫かな?と思っても実際に覗いてみると、女性モデルの頭が邪魔で何をしているのか判らなかったり。
それはそれで臨場感はあるのですが、折角のモデルが見えないと勿体ないですしね。
これも配置やパラメータを修正してもうまくいかなかったら没かもしれません。
もう少し計画的に配置とモーションを設計した方が良いかなとも思いますが、どうせ設計通りにはなりませんので。
あと立体度が強すぎるようにも思えるのですが、視差はどのパラメータを設定すれば良いのでしょうか。一度ちゃんとマニュアルを読まないとダメですね。