【Unity】アニメーションのお勉強(IK編)

前記事でBoneについてまとめましたが、
骨格を設定すれば、スプライトを動かせる事が分かりました。

一つのスプライトからモーションが作れるので、
便利なんですが、更にIKなるものが存在すると言う事で、
試してみたいと思います。

まずIKについてですが、インバースキネマティクスの略なんだそうです。
連続した骨格の先端から動かす事で親になる骨を連動させる方法なんだとか。

簡単に言うと、物を掴む動作を設定したい場合、
肩・肘・手と骨格を動かす事になるのですが、
角度を調整するのが結構難しかったりします。

IKを入れる事で、手を掴みたい物に寄せると
肩や肘がコンピューターの計算で自動的に連動する仕組みとなります。

子骨から親骨を連動させる仕組みと言った方が分かり易いでしょうか。

反対にFK(フォワードキネマティクス)ってのがあるそうですが、
UnityではIKが使えるので、早速勉強してみたいと思います。

IKを使うにあたって、骨格が無いと扱えないので、
前記事のアンドロイドを使っていきます。

骨格の設定については、前記事を参照下さい。

今回は、IKを使って走るモーションを作成してみます。
まず、アンドロイドにIKを導入する為、準備をします。
アニメーションIK㉗.jpg
ヒエラルキーの一番下に空のオブジェクトを作成して、IKとリネームしておきます。

このIKオブジェクトにIKManager2Dコンポーネントをアタッチします。
アニメーションIK㉘.jpg
コンポーネントの一覧にIKManagerが出てないと思うので、
検索窓にIKと入力すると表示されると思います。

検索でも出ない場合は、Package内に無いので、PackageManagerから
インポートして下さい。
アニメーションIK㉙.jpg
追加したIKManager2DにIKSolversの項目があるので、+をクリックします。
アニメーションIK㉚.jpg
三種類のソルバーが用意されています。
Chainが二種類とLimbです。

Chainは、多段階の骨格を動かすのに使います。
Limbは、肘やひざのように二骨格3支点をメインに設定できます。

なので、Limbをクリックします。
アニメーションIK㉛.jpg
NewLimbSolver2DがIKの中に作成されたと思います。
右腕から編集していくので、右腕 LimbSolver2Dとリネームしておきます。

各部位のソルバーを用意するので、リネームしておかないと
のちのち非常に面倒になります。

このソルバーが骨格の制御を行います。
ソルバーが制御する骨格を識別するのに、二つのオブジェクトが必要になります。

・エフェクター
・ターゲット

名前からすると高機能なオブジェクトに聞こえますが
ただの空のオブジェクトを二つ用意するだけです。(^.^; オホホホ

エフェクターは、どの骨格を制御するか指定するオブジェクトです。
エフェクターと骨格を紐づけする事で、エフェクターが動くと紐づいた骨格を
ソルバーが動かすといった感じでっす。

エフェクター自体を動かしても骨格は動くのですが、
Animationにする際は、ターゲットが必要になります。

エフェクターは、ターゲットに向かうように出来ています。
ターゲットを動かすとエフェクターが追いかけてくるって感じです。

Animationのkeyを設定する時にターゲットのTransformを操作する事で
エフェクターに紐づけされた骨格が連動するようになっています。

説明が大まかになりましたが分かったですかね~
ケロは、この部分を理解するのにかなりの時間を費やしました(T-T) グスッ

説明だけでは分かりにくいので、実際に設定していきます。
まずは、右腕のエフェクターを設定します。
アニメーションIK㉝.jpg
今回は、手首は動かさないので、肘から手首までの骨に空のオブジェクトを追加します。
追加したオブジェクトを右腕エフェクターとリネームしておきます。
アニメーションIK㉞.jpg
右腕エフェクターは手先の当たりに位置取りしておきます。
このエフェクターが可動部の先端になります。
エフェクターの位置が適当だと意図した動きにならないので、
設定する骨の先端、もしくは可動部の先端に配置するといいようです。

空のオブジェクトが見えなくて掴めないって時は、
タブの十字をクリックするとオブジェクトのギズモが表示されるので、
掴めるようになるかと思います。

エフェクターが設定できたので、続いてターゲットを作ります。

Animationでは、ターゲットの座標keyが必要になるので、
Animationファイルを作る胴体の中に用意します。

ちなみにターゲットを壁や床に設定すると触れた時に
自然に腕や足が曲がる動作が実現できるようです。
この辺りは、いろいろと試してみると面白いと思います。

本題に戻って、ターゲット作成です。
アニメーションIK㊳.jpg
胴体に空のオブジェクトをアタッチして右腕ターゲットにリネームします。
設置位置は、Animationで操作するので分かり易い位置に設置しておけばOKでっす。

二つのオブジェクトを用意できたので、ソルバーの設定をします。
先に作った右腕 LimbSolver2Dのインスペクターを見ます。
アニメーションIK㊴.jpg
エフェクター・ターゲットの項目があるので、それぞれにアタッチします。

この状態でシーンを見ると
アニメーションIK㊱.jpg
エフェクターを起点に二骨格3支点が設定されています。

これで右腕が動くようになったので、
ターゲットをドラッグして動かしてみて下さい。
腕が連動するかと思います。

たまに逆関節になる時があるので、その場合はFlipにチェックを入れて下さい。
治ると思います。

これで右腕は設定完了でっす。

続けて左腕を設定します。
右腕と同じようにエフェクターとターゲットを追加します。
続いて、IKオブジェクトを選択して、
アニメーションIK㊲.jpg
LimbSolver2Dを追加します。

新しく追加されたソルバーを左腕LimbSolver2Dにリネームしたら
右腕と同じ要領で、エフェクター・ターゲットを指定します。

走るアニメーションを作りたいので、足にもソルバーを設定します。
足首も今回は設定しないので、ひざから足首までの骨にエフェクターを設置します。

最終的には、
アニメーションIK㊵.jpg
こんな感じで設定しました。

ソルバーの準備ができたので、Animationを作成します。
胴体を選択して、Animationを開きます。

最初に0:00秒のポーズを作ったらレコーディング開始でっす。
アニメーションIK㊶.jpg
必要なフレームにグリッドを合わせて、右腕ターゲットをドラッグして
位置を決めます。

位置が決まったら、そのままグリッドを次の必要なフレームに移動させて、
右腕ターゲットをドラッグして位置決めをします。

今回は、0:10秒毎に位置を設定しました。
0:05と0:25秒にkeyを設定していますが、カクツキを修正する為なので、
気にしないで下さい。(V)o¥o(V)ふぉふぉふぉ

残りのターゲットも同じようにして位置を入力していきます。

全ての動きをレコーディングしたら再生してみます。

少しカクツキはありますが走るモーションができました。

Animationにレコーディングする点での注意点は、
ソルバーで指定したBoneは、直接角度を設定しても記録されないって事です。
エフェクターでも骨格を動かせますが、エフェクター座標も記録されません。

早い話がターゲットに依存してしまうからです。
なので、ターゲットの座標を記録する必要があります。

この辺りを理解してないとハマります。(T^T) ヒック

骨を一つ一つ設定するAnimationは、非常に手間が掛かりますが、
IKで作るとかなり手間が減らせられます。

実際、骨を動かして作った時間より1/3くらいの時間で
作る事ができました。

少し補足すると、IKを使う場合、動作の計算コストが掛かるって事です。
骨を一つ一つ設定するモーションよりソルバーが動くので当然なんですが…

効率を取るかリソースを取るか…
難しい所ですね~

Androidアプリ程度なら問題もないような気がするんですが…

なにはともあれ、
モーションを作りたい方は、IKを試してみる事をおすすめします。
いろいろとターゲットを変えながら試してみると面白いかと思います。

IKアニメーションについては以上となります。
何かの参考になれば幸いかと思います。

それではこのへんで (o・・o)/~マタネェ

この記事へのコメント