Unreal Engine 5のコントロールリグで、胴体から手首までをIKで動かし、手首から先をFKで回転するリグ構成と処理を実装する方法です。
FKの操作がしやすいように、FKのコントロールをIKの動きに追従させます。
1.リグ構成の作成
FKのコントロールを直接Set Transformノードで移動すると、コントロールを操作できなくなるので、Nullをコントロールの親にして、間接的に移動できるようにリグを作成します。
- 手首のボーンを右クリック
- IKのコントロール、FKのコントロール、Nullを作成
- 作成したコントロールとNullを親から解除
- FKのコントロールをNullの直下に移動して、上図の構成を作成
2.リググラフの作成
コントロールリグのリググラフで、処理を実装します。
処理全体の概要
手首から先をFKで回転させる→胴体から手首までをIKで動かす→FKのコントロールを移動回転する、という流れです。
手首から先をFKで回転する処理の実装
コントロールの回転量を取得し、手首のボーンを同様に回転します。
- Get Transformノードで、FKのコントロールの初期ローカル姿勢と現在ローカル姿勢のQuaternionを取得
- 初期ローカル姿勢の逆Quaternion×現在ローカル姿勢のQuaternionで、コントロールのローカル回転量のQuaternionを計算
- Offset Transformノードで、コントロールのローカル回転量分だけ手首のボーンを回転
Full Body IKで胴体から手首まで移動回転する処理の実装
- Full Body IKノードで、胴体から手首までのボーンがIKのコントロールに追従するように設定
Full Body IKの設定については、次の記事を確認してください。
IKに合わせてFKのコントロールを移動回転する処理の実装
FKのコントロールを、IKで動いたボーンの位置姿勢に移動する処理ですが、先にFKの処理をしたことと、Nullを介してコントロールを動かすリグ構成にしたことで、FKのコントロールが操作量の2倍回転する状況になっています。
これは、FKのコントロールの親であるNullが、FKで回転したボーンに追従した結果、FKのコントロールの回転量が、FK操作によるコントロールのローカル回転+FK処理によるボーンのローカル回転、となることで発生します。
この対策として、Nullをボーンのローカル回転分だけ逆回転して、コントロールと手首ボーンの姿勢を合わせます。
- Get Transformノードで、手首ボーンの現在グローバル位置姿勢、初期ローカル姿勢、現在ローカル姿勢を取得
- 初期ローカル姿勢の逆Quaternion×現在ローカル姿勢のQuaternionで、手首ボーンのローカル回転量のQuaternionを計算
- 現在のグローバル姿勢のQuaternion×ローカル回転量の逆Quaternionで、ローカル回転分だけ逆回転したグローバル姿勢のQuaternionを計算
- Set Transformノードで、手首ボーンのグローバル位置姿勢からローカル回転分だけ逆回転した姿勢に、Nullを移動
以上です。
コメント