こんにちはっ🌟八ツ橋まろんです!
Unityで3Dキャラクターを使って映像を作るとき、キャラクターモーションはHumanoidアニメーションを使います。
Humanoidアニメーションは、キャラクターごとのリグの名称やTransformの違いを吸収してくれて、下の画像のように、全く別のキャラクターが同じポーズになってくれてとても便利です。
Humanoidアニメーションには手足や頭、腰などのリグの回転値がキーフレームとして記録されているのはわかると思いますが、実はFoot IKやHand IKのターゲットの位置も記録されています。(記録されていないものもあります)
[画像:Humanoidアニメーション内のFoot IK、Hand IKの項目]
IKというのはInverse Kinematics(インバース・キネマティクス、逆運動学)の略で、要するに『手や足首などの末端をターゲットに合わせて、肘や膝のような中間は計算で求めるよ』という動かし方です。あやつり人形を動かすような感じです。
これに対して、通常のHumanoidアニメーションはFK(フォワード・キネマティクス、順運動学)で動きます。リグを順番に回転をさせることでポーズを取らせる動かし方です。フィギュアを動かすような感じです。
Foot IKやHand IKの項目は、IKのターゲットの情報が記録されているわけですが、このIKはどうやって使うのでしょう?
(Humanoidアニメーションは通常FKモードで動作するため、Foot IKやHand IKのキーフレームは使いません。使わないならキーフレームを削除したほうがデータを軽量化できます。)
今回は、このFoot IK、Hand IKの使い方と、使うことでどうなるのかを探ってみました。
Foot IK、Hand IKの挙動を探る
IKを使うとどんな挙動になるのかを探ってみます。(IKのオンオフの仕方は後述します)
2体の別のキャラクターを用意して、サイズを合わせます。
(Hipsボーンの高さが揃うように拡縮します)
[画像:サイズを合わせた2体、腰に刺さっているCubeはHips高さ合わせ用]
次に、2体の違いを見比べます。
UpperLegとLowerLegの開始位置にCubeを刺してみると、茶髪のキャラクターの方が少し脚が長いということがわかります。
[画像:UpperLegとLowerLegの開始位置にCubeを刺して脚の長さを比較]
この状態で2体を重ねて、同じアニメーションを適用します。アニメーションは、ピンク髪のキャラクターを使って作成し書き出したものです。
同じポーズを取りますが、足の終着点が少し違いますね(下画像)。これは、FKモードで動作しているために、足の長いキャラクターの方が末端の移動が大きくなったためです。
[画像:茶色の靴(脚の長いキャラクター)の方が少し外側にある]
では、Foot IKを有効にしてIKモードで動作させます。
(IKモードで動作させる方法は後述)
すると、足の末端位置が同じになりました。
ピンク髪のキャラクターでアニメーションを作成したので、Foot IKはピンク髪のキャラクター準拠で記録されており、結果として、外側にあった脚が内側に寄りました。
つまり、Foot IKを使うことで、 『脚の長さの違いによる足の位置ずれがなくなった』 ということになります。
これは、同じモーションのキャラクター変更や、モーションキャプチャなどで起きる『足すべり』に対して非常に有効ですが、 想定キャラクターより脚が長いと、それだけ膝が曲がる ことには注意してください。
次に、2体の腕の長さを比べると、茶髪のキャラクターの方が少し長いですね。
先ほどのアニメーションで比べてみると、FKモードでは同じポーズですね。
ただし、腕の末端位置は腕の長いキャラクターの方が遠い位置にあります。
Hand IKを有効にしてみると、手の位置が同じになりました。ピンク髪のキャラクター準拠のアニメーションなので、肘を曲げることで手の位置を調整していますね。
Hand IKを使うことで、 『腕の長さの違いによる手の位置ずれがなくなった』 ということです。これは、 両手を合わせたり、体をタッチするようなアニメーションでとても有効です 。特に拍手のようなアニメーションは、キャラクターを変えると手のひらが貫通したり、隙間ができたりするので、これを吸収してくれるHand IKはとてもありがたいですね。
Foot IKの使い方
Unityで映像制作をするときは、Timelineを使いますね。Timelineに並べたアニメーションは、アニメーション毎にFook IKの有効・無効が設定できます。
(もちろん、HumanoidアニメーションにFoot IK用のキーフレームが存在する必要がありますが)
Hand IKの使い方
Foot IKと違い、Hand IKを有効にするにはスクリプトとAnimator Controllerが必要になります。Timeline機能が実装されたUnity2017以前や、そもそもTimelineを使わない場合は、Foot IKでもスクリプトとAnimator Controllerが必要です。
まずはAnimator Controllerを用意します。とはいっても準備は簡単で、新たにAnimator Controlelrを作成し、そのIK Passにチェックを入れて、キャラクターのAnimatorコンポーネントにセットするだけです。
そして、以下のようなスクリプトを書くことで、Hand IKが有効になり、IKモードで動作するようになります。
using UnityEngine;
public class HandIK : MonoBehaviour
{
public Animator animator;
[Range(0,1)]
public float weight = 1;
void OnAnimatorIK()// Animation Controller events
{
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight);
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight);
animator.SetIKHintPositionWeight(AvatarIKHint.LeftElbow, weight);
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, weight);
animator.SetIKHintPositionWeight(AvatarIKHint.RightElbow, weight);
}
}
スクリプト内のOnAnimatorIK()で、手の位置をターゲットの位置に持っていきます。
このOnAnimatorIK()はStart()やUpdate()のようにUnity側で用意されている特殊な関数で、これが発動するためにはAnimator ControllerのIK Passが有効である必要があるのです。
まとめ
UnityのHumanoidアニメーションのFoot IK、Hand IKのキーフレームを使う方法と、その効果を探ってみました。
手足の長さが違うキャラクターに変更した際に強力な機能です。必要に応じてFKとIKで使い分けていきたいですね。
それでは🌟
八ツ橋まろん