【MAYA】スプラインIKのコントローラを作成する
尻尾やスカートに代表されるスプラインIKの、コントローラ作成までの手順覚書。
使用MAYAバージョン:2019.2
- 準備
- ジョイントの方向を合わせる
- メッシュをバインド
- ダミージョイントの作成
- ダミーとジョイントの接続
- スプラインIKの作成
- クラスタハンドルの作成
- コントローラの作成
- 完成
- おまけ:ツイストの追加
- ツイストの完成
準備
モデルを作ってジョイントを配置。
わかりやすいように、露骨にジョイントを増やしてみた。
ジョイントの方向を合わせる
次に【ジョイントの方向】を一致させる。
【ジョイントの方向】は、アトリビュートエディタ>ジョイントにある。
この方向をビュー上で視覚的に確認したい場合は、ジョイントをすべて選択して、
メインメニュー > ディスプレイ > トランスフォーム ディスプレイ > ローカル回転軸
を実行すると表示される。
ジョイントの方向(ローカル回転軸)を表示した状態
画像を見ると、一番下のジョイントだけX軸方向が90度ずれているのがわかる。
ジョイントを作成するときに、パースペクティブビュー以外のビューでグリッドにスナップさせながら作ると、X+方向がジョイントの進行方向になるが、このように最後の1つだけおかしくなる。
これを他と同じように修正する。
メッシュをバインド
メッシュにジョイントをバインドする。
今回は鎖なので、鎖1つにジョイント1つをウェイト100%で割り振った。
適当に曲げて確認してみたの図。
ちなみにこのようにグニャグニャに曲げてしまったジョイントを元の姿勢に戻す時は、
ジョイントのルートを選択して、メインメニュー > スキン > バインドポーズに移動で治る。
ダミージョイントの作成
Softimageの頃からリグは
の構成で作ってきてるので、MAYAでも同じことをしている。
ゲーム用のデータは無駄なものを含められないし、多分これで合ってる。
ということでダミージョイントを作成する。
ダミーはジョイントをコピーして名前を変えるだけ。
複製して作ったダミーにはバインドポーズがない(本来スキンのバインド時に自動で作成される)ので、無理やり作っておくと安心。
ダミージョイントのルートを選択して、
dagPose -bp -save
とスクリプトエディタに入力して実行する。
参考:
http://mam2apo.xsrv.jp/maya-multi-bindpose-delete/
チャネルボックスの出力欄に【bindPose数字】が作成されたら成功。
ダミーとジョイントの接続
作成したダミーと、元のジョイントの移動、回転、スケール値を完全に同期させるために、トランスフォームアトリビュートをすべて接続する。
接続方法は2通りある。
- ノードエディタで1本1本線をつなぐ
- 接続エディタで項目を選んでつなぐ
ノードエディタの場合は、下図の赤枠部分の線を1本1本つないでいく。
接続エディタの場合は、下図のようなエディタ上でつなぐ項目を左→右の順番で選んでいく。
ちなみにこの接続エディタを使う場合は、左側(右側)の表示 > キー設定不可の表示のチェックマークを外すと、項目が減って見やすくなる。
だが、どちらの方法も数が多いと大変面倒なので、できればスクリプトで簡略化したい。
幸い、以下の本にそのスクリプトが載っているので、それを使っている。
接続(1:1の場合)はチャネルが黄色になる。
スプラインIKの作成
ここからはダミージョイントに対して作業する。
メニューをリギングにして、
スケルトン > IK スプライン ハンドルの作成オプション
オプションの設定は以下。
スパン数は、作成されるカーブのcv数が『3+設定した値』になる。
cvの数がそのままコントローラの数になるので、足りないと思ったら多めにしてもいい。
ビュー上でD_joint1>D_joint_Effの順に選択するとハンドルとカーブが作成される(アウトライン上の選択では機能しないのが不便)。
D_Rootではない。D_Rootはカーブそのものを動かすために使う。
クラスタハンドルの作成
クラスタというものを作って、これで間接的にカーブを操作する。
作成されたカーブを選択して、
メインメニュー > 選択>クラスタカーブ
を実行すると、カーブのCVのところに『Cluster数字Handle』というオブジェクトができる。
というか、このコマンドなんでメニューのこんなとこにあるの。
試しにクラスタハンドルを選択して動かしてみて、カーブの動きとメッシュの動きが連動するか確認する。
ここまで来たら、あとはこのクラスタを操作するコントローラを作ればいいだけになる。
自動で作成された『ikHandle』『ClusterHandle』は全部Dummyグループの子にしてまとめる。
コントローラの作成
コントローラに使うためのカーブオブジェクトを作成する。
作成法は割愛するが、以下のリンク先でスクリプト化まで含めたコントローラオブジェクトの作成について詳しいので参考にした。
Maya; Python で Rig用 ICON を作ろう!!
https://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_07/
必要な分だけカーブを作る
グループ化して名前を変更
名前はわかればいい。
作ったカーブをグループ化したあと、グループノードをhandleの位置に合わせる。
カーブは親子にしないほうが動かしやすいので並列(正しいかは知らない)。
合わせたハンドルとダミージョイントをペアレントコンストレイントして、親子構造を変更する。
コンストレイントのつなぎ順は以下の通り。
Ctrl_Root > D_Root
Ctrl_cluster1 > cluster1Handle
以下略
クラスタをグループにまとめてグループをD_Rootの子に移動。
完成
コントローラに移動アニメーションをつけて動かせるようになった。
2022/10/06 追記:
上の動きに加えてCtrl_Rootに移動アニメをつけると、全体が動きます。
おまけ:ツイストの追加
実はこのままだとねじれ表現ができない。
とりあえずねじれ用のコントローラを作成して追加する。
ねじれは、ikHandle1のアトリビュートで設定する。
ツイストタイプを『イーズイン/アウト』にして、ツイストに値を入れると、カーブの終端に向かって徐々にねじれるようになる。
この『ツイスト』に、先程作成したコントローラのY軸回転を1:1で接続する。
これで行けると思ったのだが、コントローラの回転とねじれの回転が逆になってしまったので、エクスプレッションで-1をかけた値がツイストに入るようにした。
エクスプレッションエディタは、ツイストの数値の欄で右クリックして『新規エクスプレッションの作成...』で開ける。
接続を解除してから開いて、以下のように設定する。
Ctrl_Twistは移動されても困るので、移動チャネルはロックしておこう。
ツイストの完成
コントローラのY軸回転で 鎖がねじれるようになった。