Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity】2D Animation IKを使ったアニメーションとIK Solverの紹介

Unity 2021.1.0f1 Personal(2021年4月)
前回の続きです!
今回はUnityの2D AnimationにIKをつけていきます。
IKとはInverse Kinematics (逆運動学)で、Forward Kinematics(FK, 順運動学)の逆の考えです。
FKが体幹から連なったボーンの位置・角度をひとつずつ順に決定していくのに対し、IKは末端部分(手先や足先)が動いた時に他の関節(肘・肩など)の位置・角度が連動して決められます。

IKを使うと、たとえば地面が変形した時それに合わせて足関節が動き、適切に地面と接するように調整してくれるなど状況に合わせた自然なアニメーションを実現できます。

IKを扱う上で覚えておくべき用語

IKを使う前に覚えておくべき基本用語をご紹介します。

Chain:
互いに親子関係にあり、互いに影響を受け合うボーンの集まり(腕や脚などの塊)
Effector:
IKの最先端にあるボーン。Effectorの動きがChain全体に影響を与える。
Target:
Effectorが目指す目標地点。
Solver:
EffectorがTargetに到達もしくは最大限近付くためのアルゴリズム。
Unityは標準でCCD, FABRIK, Limbが用意している。

f:id:hiyotama:20210403131652p:plain
Effector(Chainの先端)はTargetに到達しようとして動く

IK Manager 2Dを使う

それでは実際にIKを実装していきます。
前回作成した2DアニメーションモデルにIK Manager 2Dコンポーネントを取り付けます。

f:id:hiyotama:20210403072148p:plain
IKManager2D

IKSolversの+ボタンを押しソルバーを作成します。
今回は一番シンプルなLimbを選択します。

f:id:hiyotama:20210403132141p:plain

New LimbSolver2Dという名前のソルバーが生成されますので、Effectorにボーンを、Targetにソルバー自身を指定します。

f:id:hiyotama:20210403132833p:plain
EffectorとTargetを指定

この時点でSceneビュー上でソルバーを動かすとIKを体験できます。

f:id:hiyotama:20210403133427g:plain

左手の角度が固定されていておかしいので、ソルバーのConstrain Rotationをfalseにしてなりゆきで角度が変わるようにします。

f:id:hiyotama:20210403133603p:plain
Constrain Rotationをfalseに

f:id:hiyotama:20210403133941g:plain
IKに合わせて手首の角度が変わりました

同じ要領で右手・両足もLimbを作成します。
意図しない方向に関節が曲がった時はFlipを変更します。

f:id:hiyotama:20210403134804p:plain
変な方向に曲がった

f:id:hiyotama:20210403134930p:plain
Flipを変更すると

f:id:hiyotama:20210403135009p:plain
正しく曲がるようになります

前回Animatorビューでアニメーションをつけました。
同様にレコードボタンを押してから適度にフレーム間隔を空けてIKを動かせばIKアニメーションを作ることができます。

f:id:hiyotama:20210403135643p:plain
AnimatorビューでLimbの動きをレコード

f:id:hiyotama:20210403140105g:plain
IKを利用したアニメーション実現

IKソルバーの紹介

今回は最もシンプルなLimbでの実装を紹介しました。
Unityでは3種類のソルバーが用意されているのでご紹介します。

Chain(CCD)
Cyclic Coordinate Descent Inverse Kinematics 循環座標降下
1フレームに何回も各ボーンを動かして目標座標を目指す軽量のIKアルゴリズム。
Chain Length:
影響する関節数をで指定
Iterations(反復):
アルゴリズムを適用する反復回数。
少なすぎると不正確な位置に、多すぎると結果が出た後も無駄な処理を繰り返します。
IKを実際にゲームで使う場合はごく小さい数値に、アニメーションの位置を知るためだけに使う場合は大きい数値にします。
Tolerance(耐久):
IK Solverを完了したとみなす距離。
transform.positionの値(unit)を扱う。
Velocity:
アルゴリズム1往復ごとに加算できる回転の大きさ。
Weight:
IK Solverがアニメーションに影響する強度。
強度はIK Manager 2DコンポーネントのグローバルなWeightと掛け合わせて決まる。
Constrain Rotation(強制した角度):
trueにするとEffectorに指定されたボーンの角度が固定される。
falseにするとEffectorのボーンはIKのなりゆき変化する。またrotation.zを変更して直接角度を変えることもできる。
Solve from Default Pose:
trueにすると、IKが実行される直前に、各Transformがデフォルトの位置にリストアされる。

Limb(リム、手足)
CCDの関節を2つ(Transformを3つ)に限定したIKソルバーで、CCDより簡易に扱えます。
Flip:
関節の曲がる向きを反転

Chain(FABRIK)
Forward And Backward Reaching Inverse Kinematics 前方後方到達インバースキネマティクス
根元と先端を交互に基準として繰り返しながら関節角度を調整していくIKアルゴリズム。

FABRIK は一般的に、CCD よりも少ない反復回数でターゲットに到達することができますが、チェーンに回転の制約がかけられている場合は、1 回の反復処理が CCD よりも遅くなります。

Getting Started with 2D Inverse Kinematics2D インバースキネマティクススターティングガイド - Unity Technologies Blog

FABRIKのオプションはCCDからVelocityを抜いたものです。

今回は以上となります。
ありがとうございました〜。(つづき