トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

FinalIKのRotationLimitをVRMに使いたいが動かない

FinalIKで角度制限したい

FinalIK+VRコントローラーでキャラクターの動きを制御するときの話。

腕や手首などがあらぬ方向にまで曲げることができてたり、ねじれたりしてしまう。

f:id:bibinbaleo:20201002140203p:plain

f:id:bibinbaleo:20201002144825g:plain

それを角度制御できるコンポーネントがFinalIKに入っているらしい。

RotationLimitフォルダに入っているこの子たち

f:id:bibinbaleo:20201001170305p:plain

FinalIk>RotationLimitの使い方ドキュメント

公式ドキュメントのRotationLimitのリンクを開くと別のページに来る。

f:id:bibinbaleo:20201002111054p:plain

リンク違ってたみたい。14番にあった。

www.root-motion.com

ヒンジの回転制限により、回転は軸の周りの単一の自由度に制限されます。この回転制限は加算的です。つまり、ヒンジ制限はどちらの方法でも360度を超える可能性があります。

って書いてある。

だが特に詳しい使い方の説明はない

サンプルシーン

ここに二つRotationLimitのサンプルシーンがある

f:id:bibinbaleo:20201005133118p:plain

RotationLimitsシーン

f:id:bibinbaleo:20201005132755p:plain

各種RotationLimitがついている。制限角度を変えると、部位がその範囲に収まるように動くのが分かる

f:id:bibinbaleo:20201005132759p:plain

 

Turretシーンでは、Targetオブジェクトを真下を通るように動かすとあるところで、タレットがクルっと回転する。

f:id:bibinbaleo:20201005133309p:plain → f:id:bibinbaleo:20201005133301p:plain

RotationLimitHingeがついている。なぜかActiveになっていないけど

f:id:bibinbaleo:20201005133305p:plain

RotationLimit使ってみる

4種類ある

f:id:bibinbaleo:20201002114513p:plain

f:id:bibinbaleo:20201002114510p:plain

f:id:bibinbaleo:20201002114535p:plain

f:id:bibinbaleo:20201002114450p:plain

参考

cycling.hateblo.jp

qiita.com

 

動画

www.youtube.com

各コンポーネントの範囲設定の仕方は説明されていた。

他にもいろいろ動画があったので多分アセット作者さん?

RotationLimitHinge

まずシンプルにVR要素なしで、キャラにRotationLimitだけを付けてみる。

(後で書くけど、VRIKをオンにする動かなかった。)

肘につける。VRMだとLowerArm

f:id:bibinbaleo:20201005134818p:plain

Axisを1にしたところの軸の角度が制限される。

シーンにUIが出る。

紛らわしいけど、肘の場合この青いUIの範囲で角度が制限されるわけではない。

f:id:bibinbaleo:20201005134853p:plain

実際にRotationを動かしてみたらわかるけど、Rotation.Yをプラスにしたらあり得ない角度に肘が曲がる。

f:id:bibinbaleo:20201005135226p:plain

Yの値を動かしてみてどの範囲なら動いていいかを確かめると大体-145~0の間だったので、その値を設定する。

実際にMin-145,Max0にしたら青いUIはこの範囲になる。可動域とは全然あっていない。

f:id:bibinbaleo:20201005135444p:plain

これで実行して肘のRotationを動かしても、制限範囲内でしか数字が動かないようになる。

f:id:bibinbaleo:20201005140912g:plain

手首も同様に付けた。

XYZ各種制限したいので3つ付けた。

f:id:bibinbaleo:20201005141016p:plain

複数付けたらダメだ。

Hingeというのは1に設定した軸以外の値は0になるので、3つ付けると全部0になる。

f:id:bibinbaleo:20201005144600p:plain

VRIKと一緒に使うと動かない問題

もともとVRIKを使ってコントローラーでVtuberみたいにキャラクターを動かす用途で使っていた。

ただVRIKを付けているとRotationLimitが効かなかった。ねじれる。

f:id:bibinbaleo:20201005142110g:plain

VRIKを外して、RotationLimitだけ付けて直接手首の角度などをいじったら、ちゃんと制限される

解決:スクリプト実行順

似たような症状・・・スクリプト実行順を変えると良いらしい

qiita.com

ProjectSettings>ScriptExecutionOrderというものがある(初めて知った)

f:id:bibinbaleo:20201005141337p:plain

ここにVRIKはあるが、RotationLimitはなかった。

右下+マークからRootMotion.FinalIK.RotationLimitHingeを追加(下スクロールするの大変だった)

f:id:bibinbaleo:20201005141543p:plain

VRIKより下に置く。一番下に置いた。順番だけでなく数字も大きくないとダメだと思う。

f:id:bibinbaleo:20201005141551p:plain

これでVRIK有効にして、右手ターゲットにCubeを置くと制限はかかる

f:id:bibinbaleo:20201005141935g:plain

 

 スクリプトで制御するときも同じような感じで設定が必要。

VRで動かすとおかしい

上のCubeを回している奴、制限はされているが正しくない。

コントローラーに置き換えると、全然手が動かない。

というか人間の腕を制御するのにRotationLimitHinge使うの無理じゃない???

だって1軸しか動かないもん。そんな関節ある??

 

かといってRotationLimitAngleを使おうと思ったけどなんか動かない。

あっ、スクリプト実行順に入れてないからか・・・

f:id:bibinbaleo:20201005152034p:plain

Angleは1を入れた軸を中心に、Limitの範囲で他の軸が動く?

f:id:bibinbaleo:20201005152028p:plain

スクリプトで制御する

FinalIkのRotationLimitが人間向きじゃない気がしてきた。

やりたいことは単純なのでスクリプトで書いてみる。

要は各軸をこの角度で制限したいだけなのだ。。。

f:id:bibinbaleo:20201005141016p:plain

qiita.com

なんか動かない

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[DefaultExecutionOrder(+12000)]
public class RotationLimitHand : MonoBehaviour
{


    void LateUpdate()
    {
        Quaternion this_rot = this.transform.rotation//プレイヤーの位置を取得

        this_rot.z = Mathf.Clamp(this_rot.z, -90f90f); //x位置が常に範囲内か監視
        transform.rotation = Quaternion.Euler(this_rot.xthis_rot.y,this_rot.z); //範囲内であれば常にその位置がそのまま入る
    }
}

見た目上、回転しなくなった。

Inspectorの値は変わってる。

TwistRelaxer

ねじれを治すコンポーネント

手首のねじれを治したいときはその一つ上のLowerArmにつけるっぽい

IKにVRIKを付けたオブジェクトを設定。ParentとChildは実行したら勝手に入った

f:id:bibinbaleo:20201002143947p:plain

これを手首につけたら頑張って曲がらないようにしようとしているのか、ぴらぴらするようになった。何かおかしい・・・

f:id:bibinbaleo:20201002144039g:plain

標準の設定だと強度と角度が強すぎて、逆におかしな回転をするようになるので、
Weightを0.4、Parent Child Crossfadeを1に設定します。

UniVRM+SteamVR+Final IKで始めるVTuber - Qiita

だって

 

(おまけ)FinalIK+XRInteractionToolkitの使い方

そもそも私FinalIKをちゃんと触るの初めて。

でも簡単にできた。

materializer.co

VRMにVRIKを付ける

f:id:bibinbaleo:20201002135617p:plain

XRInteractionToolkitなどのHMDとコントローラーの位置を取得できる奴を入れる

f:id:bibinbaleo:20201002135623p:plain

シーンにXRRig作成

f:id:bibinbaleo:20201002135620p:plain

VRIKのSprineのTargetにCamera

f:id:bibinbaleo:20201002135954p:plain

LeftArmとRightArmにそれぞれコントローラーをセット

f:id:bibinbaleo:20201002135950p:plain

これでVirtualRealitySupportをオンにしたら普通にキャラが動いた!

f:id:bibinbaleo:20201002140200p:plain

簡単〜

参考

VRIKの各種設定値の翻訳と説明!ありがたい!だが腕はなかった

qiita.com

微調整の部分が参考になる

shinrinmusic.com

全般的な使い方

qiita.com

最後に

 

なんにもわからない