FinalIKで角度制限したい
FinalIK+VRコントローラーでキャラクターの動きを制御するときの話。
腕や手首などがあらぬ方向にまで曲げることができてたり、ねじれたりしてしまう。
それを角度制御できるコンポーネントがFinalIKに入っているらしい。
RotationLimitフォルダに入っているこの子たち
- FinalIKで角度制限したい
- FinalIk>RotationLimitの使い方ドキュメント
- サンプルシーン
- RotationLimit使ってみる
- VRIKと一緒に使うと動かない問題
- VRで動かすとおかしい
- スクリプトで制御する
- TwistRelaxer
- (おまけ)FinalIK+XRInteractionToolkitの使い方
- 最後に
FinalIk>RotationLimitの使い方ドキュメント
公式ドキュメントのRotationLimitのリンクを開くと別のページに来る。
リンク違ってたみたい。14番にあった。
ヒンジの回転制限により、回転は軸の周りの単一の自由度に制限されます。この回転制限は加算的です。つまり、ヒンジ制限はどちらの方法でも360度を超える可能性があります。
って書いてある。
だが特に詳しい使い方の説明はない
サンプルシーン
ここに二つRotationLimitのサンプルシーンがある
RotationLimitsシーン
各種RotationLimitがついている。制限角度を変えると、部位がその範囲に収まるように動くのが分かる
Turretシーンでは、Targetオブジェクトを真下を通るように動かすとあるところで、タレットがクルっと回転する。
→
RotationLimitHingeがついている。なぜかActiveになっていないけど
RotationLimit使ってみる
4種類ある
参考
Final IKのRotationLimitで可動範囲を設定。
— おばた (@obaatsu) 2016年1月13日
RotationLimitHingeで設定したが、2軸にするにはNullオブジェクトを追加しないといかんかな。
まあ概ね想定通りの動きだからいいけど pic.twitter.com/asP7dBZtdE
動画
各コンポーネントの範囲設定の仕方は説明されていた。
他にもいろいろ動画があったので多分アセット作者さん?
RotationLimitHinge
まずシンプルにVR要素なしで、キャラにRotationLimitだけを付けてみる。
(後で書くけど、VRIKをオンにする動かなかった。)
肘につける。VRMだとLowerArm
Axisを1にしたところの軸の角度が制限される。
シーンにUIが出る。
紛らわしいけど、肘の場合この青いUIの範囲で角度が制限されるわけではない。
実際にRotationを動かしてみたらわかるけど、Rotation.Yをプラスにしたらあり得ない角度に肘が曲がる。
Yの値を動かしてみてどの範囲なら動いていいかを確かめると大体-145~0の間だったので、その値を設定する。
実際にMin-145,Max0にしたら青いUIはこの範囲になる。可動域とは全然あっていない。
これで実行して肘のRotationを動かしても、制限範囲内でしか数字が動かないようになる。
手首も同様に付けた。
XYZ各種制限したいので3つ付けた。
複数付けたらダメだ。
Hingeというのは1に設定した軸以外の値は0になるので、3つ付けると全部0になる。
VRIKと一緒に使うと動かない問題
もともとVRIKを使ってコントローラーでVtuberみたいにキャラクターを動かす用途で使っていた。
ただVRIKを付けているとRotationLimitが効かなかった。ねじれる。
VRIKを外して、RotationLimitだけ付けて直接手首の角度などをいじったら、ちゃんと制限される
解決:スクリプト実行順
似たような症状・・・スクリプト実行順を変えると良いらしい
【知見】VRMとVRIKを同時に使うとスクリプト実行順の問題で揺れものが正しく動作しなくなる。
— 坪倉輝明@メディアアーティスト (@kohack_v) 2019年1月16日
ProjectSettings > Script Execution Order より、VRMSpringBone及びVRMSpringBoneColliderGroupをVRIK(FinalIK)より後に追加する事。
こんなん気付かへんやん普通…。#VRM #VRIK pic.twitter.com/B4KQKdsk4k
ProjectSettings>ScriptExecutionOrderというものがある(初めて知った)
ここにVRIKはあるが、RotationLimitはなかった。
右下+マークからRootMotion.FinalIK.RotationLimitHingeを追加(下スクロールするの大変だった)
VRIKより下に置く。一番下に置いた。順番だけでなく数字も大きくないとダメだと思う。
これでVRIK有効にして、右手ターゲットにCubeを置くと制限はかかる
スクリプトで制御するときも同じような感じで設定が必要。
Final IKが算出したボーンの角度をスクリプトから修正したい場合、DefaultExecutionOrderを+9999以上にして、LateUpdate()内でゴニョゴニョすればいけるっぽい、たぶん…
— ちょび (@chobi_luck) 2018年12月30日
LookAtが算出した首の角度に、物理の揺れを加算するのに使ってみましたが一応うまく動いてます。 pic.twitter.com/vxSWCt1qhV
VRで動かすとおかしい
上のCubeを回している奴、制限はされているが正しくない。
コントローラーに置き換えると、全然手が動かない。
というか人間の腕を制御するのにRotationLimitHinge使うの無理じゃない???
だって1軸しか動かないもん。そんな関節ある??
かといってRotationLimitAngleを使おうと思ったけどなんか動かない。
あっ、スクリプト実行順に入れてないからか・・・
Angleは1を入れた軸を中心に、Limitの範囲で他の軸が動く?
スクリプトで制御する
FinalIkのRotationLimitが人間向きじゃない気がしてきた。
やりたいことは単純なのでスクリプトで書いてみる。
要は各軸をこの角度で制限したいだけなのだ。。。
Final IKが算出したボーンの角度をスクリプトから修正したい場合、DefaultExecutionOrderを+9999以上にして、LateUpdate()内でゴニョゴニョすればいけるっぽい、たぶん…
— ちょび (@chobi_luck) 2018年12月30日
LookAtが算出した首の角度に、物理の揺れを加算するのに使ってみましたが一応うまく動いてます。 pic.twitter.com/vxSWCt1qhV
なんか動かない
見た目上、回転しなくなった。
Inspectorの値は変わってる。
TwistRelaxer
ねじれを治すコンポーネント
手首のねじれを治したいときはその一つ上のLowerArmにつけるっぽい
IKにVRIKを付けたオブジェクトを設定。ParentとChildは実行したら勝手に入った
これを手首につけたら頑張って曲がらないようにしようとしているのか、ぴらぴらするようになった。何かおかしい・・・
標準の設定だと強度と角度が強すぎて、逆におかしな回転をするようになるので、
Weightを0.4、Parent Child Crossfadeを1に設定します。
だって
(おまけ)FinalIK+XRInteractionToolkitの使い方
そもそも私FinalIKをちゃんと触るの初めて。
でも簡単にできた。
VRMにVRIKを付ける
XRInteractionToolkitなどのHMDとコントローラーの位置を取得できる奴を入れる
シーンにXRRig作成
VRIKのSprineのTargetにCamera
LeftArmとRightArmにそれぞれコントローラーをセット
これでVirtualRealitySupportをオンにしたら普通にキャラが動いた!
簡単〜
参考
VRIKの各種設定値の翻訳と説明!ありがたい!だが腕はなかった
微調整の部分が参考になる
全般的な使い方
最後に
なんにもわからない