IK(インバースキネマティクス。日本語では逆運動学)という機能は3DCGの世界でごく一般的に使われている機能のひとつですが、リアルタイムのゲームではまだまだ使われていないことも多いです。
IKを使うと高さに合わせて足の位置を調整したり、腕の位置をドアやコップの位置に合わせて移動させ、リアリティをより追求することが可能です。
今回はUE4で使えるふたつのIKノードについてを解説します。
使用するバージョンはUE4.16.1の日本語版となっています。
また今回は特に意味もなくGrayちゃんを使っていますが、ご了承ください。
Two Bone IKを使って制御する
まずは"Two Bone IK"というノードを使います。
上記のドキュメントは少し古く、既に現在のTwo Bone IKノードと少し差がありますので注意してください。
このノードはアニメーションブループリントのアニムグラフ(AnimGraph)で使います。
特に特殊なことはせずにステートマシンからの結果にTwo Bone IKノードを接続します。
Two Bone IKノードは2つから3つのボーンを指定します。
以下が今回のTwo Bone IKノードの設定です。
まず重要なのは"IKBone"です。ここがIKで動かす際に動く起点となるボーンです。必ず指定が必要です。
次に"Effect Space Bone Name"です。ここはエフェクターと呼ばれる、実際に動かすボーンなどの何かしらのジョイント情報です。なぜかプルダウンリストではなく、直接入力なので間違えないように注意してください。
最後に"Joint Target Space Bone Name"です。ここは"IKBone"に接続されたジョイントボーンを指定します。ここだけ設定がなくてもIKは動作します。
"Effector Location Space"と"Joint Target Location Space"は"Bone Space"を設定しましょう。他の設定ではかなり動かすのが難しいです。
上記設定でコンパイルを行い、Two Bone IKノードを選択するとエフェクターが表示され、それぞれのエフェクターを操作することが可能になります。
Two Bone IKのテスト動画。#UE4Study pic.twitter.com/A14oQnqLLK
— alwei@C92 1日目 東こ34b (@aizen76) 2017年6月26日
エフェクターを操作すると、"Effector Location"や"Joint Target Location"の値が変わります。もしゲーム中にこの値を書き換えたい時は変数化したものを渡して、イベントグラフ内で変数をセットしてあげればリアルタイムに反映させることが可能です。
※エフェクターを操作する際にスナップがかかっている場合、アニメーションブループリント以外のビューポートでスナップを変える必要があることに注意してください。
これで無事Two Bone IKによるIK制御ができました!Two Bone IKはひとつのボーンを重点的に操作したい時に向いています。
逆にフルボディIKのようなことはできないので、その場合は次に使う"FABRIK"を使うことになります。
FABRIKを使って制御する
次は"FABRIK"ノードを使って制御してみましょう。
FABRIKとはとても長いですが、Forward And Backward Reaching Inverse Kinematics (前方後方到達インバース キネマティクス)の略称です。
Two Bone IKと違って任意の数のボーンに対して影響を与えることができます。つまりフルボディ系IKのようなことが可能です。
以下は公式ドキュメント。
少し古いですが、4.16.1現在も特に違いはありません。
上記のようにノードを組みました。特に特別な部分はありません。次にFABRIKノードの設定です。
Two Bone IKのように影響を与えるボーンを設定します。"Effector Transform Bone"にエフェクターとして実際に操作を行うボーンを指定します。"Effector Transform Space"はこちらもTwo Bone IKと同様に"Bone Space"を指定してください。
次にソルバーの設定を行います。ソルバーとは動く範囲の影響を受けるボーンです。"Tip Bone"に一番先端となるボーンを設定します。"Root Bone"にはIKの影響を受ける最も階層が親となるボーンを指定します。"Root Bone"よりも上のボーンはIKの影響を受けません。
こちらもコンパイル後にFABRIKを選択するとエフェクターが表示されます。
FABRIKのテスト動画。#UE4Study pic.twitter.com/Nny63ehK7j
— alwei@C92 1日目 東こ34b (@aizen76) 2017年6月26日
エフェクターを操作すると、"Effector Transform"の値が変わります。こちらも"Effector Transform"に変数化したものを渡して、イベントグラフ内で変数をセットすればリアルタイムに反映が可能です。
FABRIKはひとつのノードで全身の動きを制御できるため、フルボディIKのようなことが可能です。ただしひとつのノードで完璧な全身制御はやはり難しいです。
IKを使って表現力を豊かにする
IKを使えば機械的な動きにリアリティが生まれます。VRコンテンツなどでは特にこういったIK制御が行われるだけで全然違ったものになります。
もしMayaのHumanIKのようなフルボディIKシステムが欲しい場合には、現状はプラグインを購入するなどの方が手っ取り早いでしょう。。
IKinema | Motion Capture, VR, Games - Documentation
Anomotion - Artificial Intelligence based natural motion middleware
ぜひIKを使いこなしてゲーム内の表現力を豊かにしてみてください。