2024/12/26
poleVectorを回転制御する
はじめまして。
株式会社デジタル・フロンティア、リガーのS.M.と申します。
BACKBONE様の『リグ道場』カリキュラム型教育にて人型リグ開発を受講させて頂きました。
今回はikHandleのpoleVectorをrotateで制御する手法の一つを、実際にリグを作成しながらご紹介したいと思います。
※S.M.様のリグ道場の受講は終了しております。リグ道場受講時に作成していただいた記事になります。
1.はじめに
Mayaの環境は「maya 2020.4」になります。
IKの概要をあまりよく知らない方はAutodesk様より提供されているknowledgeページ等をご覧ください。
・IKハンドルを作成する
・IK ソルバ
・シングルチェーン IK ソルバ
・回転プレーン IK ソルバ
2.サンプルシーンの用意
人型の上半身を模したjoint構造にcubeをペアレントしたデータを用意します。
こちらにIKコントローラとpoleVector制御を追加していきます。
外観と階層は下図の通りです。
※今回のリグは説明のために簡易的な階層構造で作成しています。
※プライマリ軸:X軸、セカンダリ軸:Z軸(肘が+Z回転)
3.IKコントローラの作成
IKコントローラ作成の前に、ikHandleのIKソルバに関して補足します。
Single-Chain SolverのikHandleは、ikHandleのrotateでjointチェーンの方向を制御できます。
Rotate-Plane SolverのikHandleは、poleVectorでjointチェーンの方向を制御できます。
今回はpoleVectorを利用するため、Rotate-Plane Solverを使用します。
腕にIKコントローラを作成します。
【IKコントローラの作成手順】
① IKコントローラ用のシェイプ(armIk_ctrl_L)を原点に作成します。
② IKコントローラの親ノード(armIk_ctrlSpace_L)を原点に作成します。
③「armIk_ctrl_L」を「armIk_ctrlSpace_L」にペアレントします。
④「armIk_ctrlSpace_L」を「clavicle_jt_L」にペアレントします。
⑤「armIk_ctrlSpace_L」を「wrist_jt_L」の位置にスナップします。
※「armIk_ctrlSpace_L」の回転軸は変更せずworld軸の状態です。
⑥ ikHandle (armIk_L) をRotate-Plane Solverで作成します。
⑦「armIk_L」を「armIk_ctrl_L」にペアレントします。
4.poleVectorコントローラの作成
次にpoleVectorコントローラを作成します。
poleVectorは移動制御が一般的かと思います。
まずは、poleVectorの移動制御を設定します。
【poleVector移動制御の設定手順】
① poleVector制御用のロケータ(arm_plv_L)を作成します。
②「arm_plv_L」を「lowArm_jt_L」の位置にスナップします。
③「arm_plv_L」をZ軸のマイナス方向に移動します。今回は「-5.0」移動させました。
※初期値を0にしたい場合は、Spaceノードを作成すると良いです。
④「arm_plv_L」→「armIk_L」の順に選択し、Constraint > Pole Vector を実行します。
ロケータの移動でpoleVectorが制御できるようになりました。
次に、poleVectorの回転制御を設定します。
【テスト】
「lowArm_jt_L」の位置に回転制御用のコントローラ(armRot_plv_L)を作成します。
試しに、このコントローラに「arm_plv_L」をペアレントして挙動を確認します。
一見問題ないように見えますが、IKコントローラを動かすと・・・
肘がフリップしやすい挙動になっています。
「armRot_plv_L」も「arm_plv_L」もその場に留まるので「armRot_plv_L」も移動させる必要があります。
pointConstraintを使用して、回転制御用のコントローラが常に肩~手首の中間に位置するように設定します。
「armRot_plv_L」が肩~手首の中間に位置するようになりましたが、回転は何も設定していません。
IKコントローラの動かし方によっては・・・
やはりフリップが発生します。
「armRot_plv_L」の回転軸も、常にIKコントローラの方向に向かせる必要がありそうです。
【 world up type の捕捉】
world up type を noneにすることで、up vectorを計算せずにコンストレイントターゲット方向に向けられます。下の動画は、polyCubeにaimConstraintを実行した際のworld up typeの比較です。
world up typeがvectorなどの場合、aim vector と up vector が重なると急回転が発生するようです。
反対方向も同様で、このような現象を「ローリング現象」と呼ぶようです。
(Autodesk様のknowledghより、エイムコンストレイントページ内説明)
word up typがnoneの場合は、aim vectorと反対方向を向く一点以外では急回転は発生しないようです。
5.回転制御コントローラの作成
aimConstraintを使用しつつ、階層を工夫してpoleVectorを回転制御するコントローラを設定します。
【poleVector回転制御の設定手順】
① 回転制御用のコントローラを格納する最上位の親ノード(armRot_plvSpace_L)を「upArm_jt_L」の位置に作成します。
②「armIk_ctrl_L」→「armRot_plvSpace_L」の順に選択し、Constraint > Aim を実行します。
※向ける軸:X軸、UpVector軸:Y軸、Maintain Offset:Off
③ 作成されたaimConstraintノードの「aimConstriantworld up type」を「none」に設定します。
④ 作成されたaimConstraintノードを削除します。
⑤ 「armRot_plvSpace_L」を「clavicle_jt_L」にペアレントします。
⑥ 回転制御用のコントローラをIKコントローラに向かせるためのノード(armRot_plvAim_L)を「upArm_jt_L」の位置に作成します。
⑦「armRot_plvAim_L」の移動と回転値を{0,0,0}にします。
⑧「armRot_plvAim_L」を「armRot_plvSpace_L」にペアレントします。
⑨「armIk_ctrl_L」→「armRot_plvAim_L」の順に選択し、Constraint > Aim を実行します。
※向ける軸:X軸、UpVector軸:Y軸、Maintain Offset:Off
⑩ 回転制御用のコントローラを肩~手首の中間に移動させるノード(armRot_plvPos_L)を「lowArm_jt_L」の位置に作成します。
⑪「armRot_plvPos_L」を「armRot_plvAim_L」にペアレントします。
⑫「armRot_plvPos_L」の回転値を{0,0,0}にします。
⑬「upArm_jt_L」→「armIk_ctrl_L」→「armRot_plvPos_L」の順に選択し、Constraint > Point を実行します。
⑭ 回転制御用のコントローラ(armRot_plv_L)を「lowArm_jt_L」の位置に作成します。
⑮「armRot_plv_L」を「armRot_plvPos_L」にペアレントします。
⑯「armRot_plv_L」の移動と回転値を{0,0,0}にします。
⑰「arm_plv_L」を「armRot_plv_L」にペアレントします。
poleVectorを制御するコントローラがIKの挙動に追従することで、肘のフリップの発生頻度が軽減しました。
今回はご紹介のために簡易的な階層構造で作成しましたが、
実際の業務ではローカルセットアップの概念でリグを作成しており、
外観、挙動は同じものでかつ軽量なリグになっています。
下図のように、ストレッチや、肩の移動等の機能を追加する際も
ローカルセットアップでリグを組んでいればシンプルな構造で対応できます。
6.まとめ
リグ道場では、ローカルセットアップの概念や手付コントローラの開発について、多くのことを学ばせていただきました。今回は、学んだ技術の一つとして、IKのPole VectorをRotateで制御する手法をご紹介させていただきました。
腕や足のリグは、ストレッチやFK/IKの切り替え、SoftIk、肘膝の固定など様々な機能の要望がありその組み合わせ次第で千差万別の手法があります。poleVectorのrotate制御も制御の一機能としてリグに持たせておくことで、空中戦などのアニメーションがつけやすい、手数を少なく調整を終えられるなどメリットがあるかと思います。また今回ご紹介させていただいた手法は、人型リグ以外にもメカのギミックやプロップ類のセットアップにも利用できる考え方が含まれていると思います。
是非お試しいただき、今後のリギングの一助になれば幸いです。
※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。