Unreal Engine 5のコントロールリグで、一つのコントロールで、複数のボーンの回転をFK操作する処理をリググラフで実装する方法です。
ロボットの手首が、複数の一軸回転の関節が組み合わさったボーンなので、それらを操作するために使います。
コントロールのアニメーションタイプを「Proxy Control」にして、駆動コントロールを設定する方法もあるようですが、角度制限の項目が無いので、角度制限する場合は、リググラフでノードを作成して実装する必要があります。
処理の概要
コントロール操作分の回転量のQuaternionをオイラー角に変換した後、各軸周りの回転を各関節に割り当てて回転させます。
上のリググラフはCollapseノードにまとめたものの中身です。
1.コントロールの回転を取得
コントロールの姿勢を表すRotationは、Quaternionで保持されており、そのままでは軸ごとの回転が分かりません。
そのため、回転を取得してオイラー角に変換します。
処理の詳細
- Get Transformノードで、コントロールの初期姿勢と現在姿勢をQuaternionで取得
- Inverseノードで、初期姿勢のQuaternionの逆回転のQuaternionを計算
- Multiplyノードで、初期姿勢の逆Quaternionと現在姿勢のQuaternionの積(=コントロールの回転量)を計算
- To Eularノードで、コントロールの回転量をオイラー角に変換
Quaternion同士の積は、それぞれのQuaternionの回転量を合成したものになります。
注意点
変換時の回転順は、コントロールの座標軸基準で、ボーンを回転する処理の逆順にします。
この順番があっていないと、コントロールの回転とボーンの姿勢が一致しなくなります。
これは、オイラー角での表現では、回転する軸の順番によって最終的な姿勢が変わってしまうためです。(この問題を回避するために、直感的にはわかりにくいQuaternionが使われるようです。)
2.角度制限の設定
必要に応じて関節の角度制限を設定します。
- Clampノードで、最大角度と最小角度を設定し、各軸の回転角度を制限を設定
コントロールの軸とボーンの軸が反対向きの場合は、Multiplyノードで、回転方向を反転します。
ここではMultiplyノードを使いましたが、Negateノードがあることに後から気づきました。
3.ボーンの回転
分解したオイラー角をQuaternionに戻して、各ボーンを回転させます。
- From Eulerノードで、各ボーンに割り当てる回転角度をQuaternionに変換
変換時の座標軸は、回転するボーンのローカル座標軸基準です。
Offset Transformノードで、各ボーンを回転します。
以上です。
コメント