Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 コントロールリグを使って、リグを作成してみる

UE4には以前にもコントロールリグという機能を使って、アニメーションなどを作成できるという記事を以前にも書きました。

unrealengine.hatenablog.com

ここから一年以上経過し、コントロールリグシステムはかなり進化しました。水面下で開発は行われていたのですが、いよいよUE4.21でExperimentalな機能としてリリースされるようです。

trello.com

このコントロールリグシステムですが、名前の通り、リグをコントロールすることが可能で、コントロールだけではなく、リグ自体をなんと自作できてしまいます。
しかもこのリグはアニメーション作成用途だけではなく、ゲームの中で実際に扱うことが可能なプロシージャルリグ機能として利用可能です。

では早速その使い方を見ていきましょう。


コントロールリグを有効にし、アセットを作成する

まず始めにコントロールリグはプラグインとして提供されており、標準ではオフになっているので有効化しておく必要があります。有効化後は一度エディターを再起動します。

f:id:alwei:20181027202423p:plain

これで問題なくコントロールリグが扱うことができるようになりました。次にコントロールリグ用のアセットをコンテンツブラウザー上で作成します。作成される時に親リグとして何を使うかを聞かれるので、"ControlRig"を選択して作成してください。

f:id:alwei:20181027202613p:plain

これが通称コントロールリグ ブループリントと呼ばれるもので、名前の通りコントロールリグを扱うことが可能なブループリントになっています。つまりこれはノードベースのビジュアルスクリプトというわけです。

f:id:alwei:20181027203000p:plain

実際に開くと、このような画面になります。早速中身を作成していきます。

ヒエラルキーとメッシュを設定する

最初はメッシュやそのスケルトンの情報もなく、何も出来ません。左下にある"Hierarchy"タブから右クリックし、"Import"→"Select Mesh"の下から既存のスケルトンのメッシュを選択します。

f:id:alwei:20181027203412p:plain

これで既存のスケルタルメッシュのスケルトン階層がインポートできます。ただしこの状態でもビューポートにメッシュは現れませんので、右上の"Preview Scene Settings"タブから"Preview Mesh"を選択します。

f:id:alwei:20181027203752p:plain

これによりやっとビューポート上に任意のスケルタルメッシュを表示させることができました。Preview Meshは自由に変更可能ですが、同じスケルトン階層を持ったものを選択することが無難かと思います。ここでは標準のEpic Skeleton構造を利用することにします。

また、このHierarchyは自由に定義可能なので、あくまでもコントロールリグ専用のリグ構造として保存しておく事が可能です。必要に応じて自由な階層を定義しておきましょう。

リグ用のコントロールを行う

いよいよノードを使って、リグを構築していきます。まずはノードグラフ内のどこでもいいので、右クリックして"Rig Hierarchy Ref"と入力した後に選択します。

f:id:alwei:20181027204311p:plain

これはスケルトンの階層構造の参照を取得することが可能で、指定した名前の階層構造を取得します。特に名前を指定していない場合には自動的に最も上位の"Root"の情報を取得するようです。詳細パネルから名前を"Base Hierarchy"とでも入力しておきます。

f:id:alwei:20181027204705p:plain

ここから"Two Bone IK/FK"ノードを使って、IKの設定を行います。とりあえず腕に対して行いたいので、今回は"Start Joint"に"upperarm_r"、"End Joint"に"hand_r"を設定します。

f:id:alwei:20181027205143p:plain

更にジョイントコントロール用のエフェクターを作成します。右クリックから"Control"というノードを検索し配置します。Controlノードの名前を"RightArm Effector"に変更し、ResultピンとTwo Bone IK/FKノードの"End Effector"ピンに接続します。

f:id:alwei:20181027205419p:plain

ここで一度コンパイルボタンを押してコンパイルすると、ビューポート上のグレイマンに変化が起きます。右腕の位置が変化しています。

f:id:alwei:20181027205713p:plain

コントロール用のノード、RightArm Effectorを選択したまま、ビューポートのマニピュレーターを操作してみましょう。

f:id:alwei:20181027205825p:plain

腕がIK処理によって上手く動いてくれるはずです。これで右手のエフェクターとして作用するようになりました。次に肘のコントロールを行う"Pole Target"の設定を行います。

f:id:alwei:20181027210108p:plain

先程と同じように、Controlノードを検索し、名前を"RightArm PoleTarget"としました。ここからResultピンの三角ボタンから中身を開き、"Translation"をTwoBoneIK/FKノードの"Pole Target"ピンへと接続します。そしてコンパイルします。

f:id:alwei:20181027210440p:plain

ControlノードのRightArm PoleTargetを選択したまま、ビューポートでマニピュレーターを操作することで、右肘の位置をコントロールすることが出来るはずです。これでTwoBoneIKのコントロールが上手く出来るようになりました。

更に改良し、初期ジョイントの位置を取得できるようにします。"Get Joint Transform"というノードを検索し、2つ配置します。Jointには"lowerarm_r"と"hand_r"を設定します。

f:id:alwei:20181027211028p:plain

上記のようなノード接続を行います。これでエフェクターの位置がジョイントの位置と同期するようになり、煩わしさが少なくなります。もし位置の同期が上手くいかない場合にはノードを一度削除し、始めからやり直すと上手くいく事があります。

これで最も簡単なTwo Bone IKコントロールが出来るようになりました!同様の設定を行うことで左腕や両足もIKで動かす事が可能になります。もちろん指先を指定すれば指だけをコントロールするリグも可能です。

その他のリグユニットについて

このようなコントロール可能なリグをコントロールリグシステム上ではリグユニットと呼ぶようです。現状のコントロールリグシステムで使えそうなリグユニットは"Two Bone IK/FK"を除くと以下の3つです。

Apply FK

名前の通り、ジョイントにFKを適用します。IKとは逆に親から子にジョイントのTransformが処理される一般的なFKです。

f:id:alwei:20181027212351p:plain

Apply FKによる首の回転。

f:id:alwei:20181027214536p:plain

Constraint

ジョイントの拘束を行うConstraintです。ここでいうConstraintがポイントコンストレイントなのか、ペアレントコンストレイントなのかはよくわかっていませんが、複数ジョイントのコンストレイントによる拘束が可能です。

f:id:alwei:20181027215312p:plain

Constraint Controlで"pelvis"の位置を動かすことで拘束された"neck_01"の位置が動く様子です。

f:id:alwei:20181027215451p:plain

Aim Constraint

こちらは視線を拘束することが可能な"Aim Constraint"です。特定の位置で拘束することにより、ジョイントを常にその方向に向けることが可能になります。

f:id:alwei:20181027220555p:plain

ジョイントの指定だけでなく、Aim Vectorの指定、更にAim Targetsを追加し、Weightが1.0になっていることを確認します。そしてTransformに拘束したいジョイントの位置などを接続します。

少しわかりやすくするためにConstraintで拘束した首を伸ばした状態にしてます。"hand_r"に位置に"head"のジョイントが常に向いていることがわかります。

f:id:alwei:20181027220850p:plain

ひとまず最小限の使い方のみですが、一通りのリグユニットの使い方でした。

これらを使って…

上記をまとめた動画です。

これらを使って何をするかと言うと、シーケンサー上でアニメーションを作成したり、UE4のゲームプレイ中にリグを使って、アニメーションをプロシージャルに生成することも可能です。

次回、それらの続きについてをまとめる予定です。