🗒️

【UE5】コントロールリグでFKとIKの切り替え機能を作ってみた

に公開

はじめに

UEはモジュラーリグでFKとIKの切り替えが実装されています。ただMayaなどでよく使われる0~1の値でブレンドしてFKとIKを切り替える方法ではありません。同じことがコントロールリグで可能なのか試しにマネキンモデルの腕で作ってみました。その方法をご紹介します。使用したUEのバージョンは「5.6」です。

FKとIKの切り替えデモ

1.FKとIKそれぞれの制御用ジョイントを作成

腕のジョイント「upperarm」「lowerarm」「hand」のジョイントからリグ用のジョイントを作成します。ジョイントの右クリックメニューから新規要素 > 新しいジョイントで作成することができます。

階層構造も同じにしておきます。
このジョイントにそれぞれIK用のリグとFK用のリグを作成していきます。

2.コントローラーの作成

IKに関しては「hand」の位置にIKの位置を動かすコントローラーと「lowerarm」の位置からひじ側にオフセットしてポールベクターを動かすコントローラーを作成します。

FKに関してはそれぞれのジョイント対応するコントローラーを作成します。

どちらも形状や色は好みです。

3.コントロールリグの作成

ForwardsSolveで作成していきます。

IKの設定

BasicIKノードを使います。ItemにIKのジョイント、EffectorとPoleVectorに作成したコントローラーを設定します。SecondAxisはそのままだとねじれてしまったのでYを-1.0にしました。

FKの設定

ここは特殊なことは何もしていません。作成したFKコントローラーでそれぞれ対応するFKのジョイントの回転を操作できるようにしています。

FKとIKのブレンド設定

まずはFloatの変数を作成します。名前は「blendWeight」としました。
値の範囲は0~1としておき、この値が0の時はFKジョイントの回転値、1の時はIKジョイントの回転値になるようにします。

計算はLerpノードがあればよかったのですがコントロールリグでは使用できませんでした。またAccumulateLerpノードは今回作りたい挙動には適しません。なので自分でLerp関数を作成し、blendWeightの値に応じたジョイントに設定したい回転値を計算しています。

Lerp関数の中身です。
回転のQuatのままでは計算ノードを使用できなかったので、ToEulerノードで一旦オイラーに変換して、最後にまたFromEulerでQuatに戻しています。
計算は IKの回転 + (FKの回転 - IKの回転) * weight値 を行っています。

これを「upperarm」「lowerarm」「hand」それぞれで行います。

コントローラーの表示設定

FKの時はIKのコントローラーを非表示にして、IKの時はFKのコントローラーを非表示にします。0~1の間の時は両方表示するようにしました。アニメーターが動かす予定がなければ必要ないかもしれませんが、設定してあると今どちらのモードなのか分かりやすいと思います。
コントローラーの表示はSetControlVisibilityで設定できます。

Discussion