Unreal Engine 5のコントロールリグで、ボーン同士を連動させる処理を実装する方法です。
例として、フルボディIKで動かすロボットの腕に、肩パーツが連動して動くように設定します。
下の動画のように、腕が外側に動く場合に肩パーツも外に動き、腕が内側に動く場合は肩パーツが一定以上内側に動かないようにします。

フルボディIKで動いた腕のボーンの回転量を計算して、オイラー角度に変換します。
腕のボーンが外側に回転していれば肩パーツのボーンを動かし、内側に回転していれば動かさずに処理を終わります。
グラフの詳細は、以下の通りです。
1.腕の回転量の計算

- Get Transformノードで、腕の初期姿勢と現在姿勢をQuaternionで取得
- Inverseノードで、初期姿勢の逆Quaternionを計算
- Multiplyノードで、初期姿勢の逆Quaternionと現在姿勢のQuaternionの積(=腕の回転量)を計算
覚え書き
Quaternionは4つの数値で3つの軸周りの回転方向と角度を表したものです。
2つのQuaternionの積は、それぞれのQuaternionが表す回転を合成した回転になります。
2.腕の回転角度の判定
Quaternionのままでは回転方向や角度が判別できないため、オイラー角度に変換してから角度を判定します。

- To Eularノードで、腕の回転量のQuaternionを、オイラー角度に変換
- Lessノードで、腕の回転のオイラー角度が0より小さい場合(=外側に回転している場合)、Trueと判定
3.肩パーツの回転実行
腕が外側に回転している場合だけ、肩パーツを回転します。

- Branchノードで、Lessノードの結果がTrueの場合のみ、Offset Transfromノードを実行
- Offset Transformノードで肩パーツを回転
腕が内側に回転している場合は、Full Body IKノード以降の処理は実行されず、肩パーツは回転しません。
以上で、腕の回転に連動して、肩パーツを動かす機能を実装できました。
コメント