【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