夜はCGの時間

ゲームのデザイン仕事を生業にする筆者が、色々なツールのちょっとしたネタやTipsなどを投稿、まとめる備忘録ブログです。

【MAYA】スプラインIKのコントローラを作成する

尻尾やスカートに代表されるスプラインIKの、コントローラ作成までの手順覚書。

f:id:Magotarou:20200308230810p:plain

使用MAYAバージョン:2019.2

 

 

 

 

準備

モデルを作ってジョイントを配置。

f:id:Magotarou:20200308164032p:plain


わかりやすいように、露骨にジョイントを増やしてみた。

 

 

ジョイントの方向を合わせる

次に【ジョイントの方向】を一致させる。

【ジョイントの方向】は、アトリビュートエディタ>ジョイントにある。

f:id:Magotarou:20200308022703p:plain

 

この方向をビュー上で視覚的に確認したい場合は、ジョイントをすべて選択して、

メインメニュー > ディスプレイ > トランスフォーム ディスプレイ > ローカル回転軸

を実行すると表示される。

f:id:Magotarou:20200308022817p:plain

 

ジョイントの方向(ローカル回転軸)を表示した状態

f:id:Magotarou:20200308164206p:plain

 

画像を見ると、一番下のジョイントだけX軸方向が90度ずれているのがわかる。

ジョイントを作成するときに、パースペクティブビュー以外のビューでグリッドにスナップさせながら作ると、X+方向がジョイントの進行方向になるが、このように最後の1つだけおかしくなる。

 

これを他と同じように修正する。

f:id:Magotarou:20200308021158p:plain

 

 

メッシュをバインド

メッシュにジョイントをバインドする。

今回は鎖なので、鎖1つにジョイント1つをウェイト100%で割り振った。

適当に曲げて確認してみたの図。

f:id:Magotarou:20200308164433p:plain

 

ちなみにこのようにグニャグニャに曲げてしまったジョイントを元の姿勢に戻す時は、

ジョイントのルートを選択して、メインメニュー > スキン > バインドポーズに移動で治る。

f:id:Magotarou:20200308023401p:plain

 

 

ダミージョイントの作成

Softimageの頃からリグは

  • 出力用のムダのない状態のメッシュとバインドしたスケルト
  • 元のスケルトンと完全一致させるダミースケルトン(とカーブとかIKとか)
  • ダミーやIKを操作するコントローラ

の構成で作ってきてるので、MAYAでも同じことをしている。

ゲーム用のデータは無駄なものを含められないし、多分これで合ってる。

 

ということでダミージョイントを作成する。

ダミーはジョイントをコピーして名前を変えるだけ。

f:id:Magotarou:20200308170634p:plain

 

複製して作ったダミーにはバインドポーズがない(本来スキンのバインド時に自動で作成される)ので、無理やり作っておくと安心。

ダミージョイントのルートを選択して、

dagPose -bp -save

 とスクリプトエディタに入力して実行する。

参考:

http://mam2apo.xsrv.jp/maya-multi-bindpose-delete/

 

チャネルボックスの出力欄に【bindPose数字】が作成されたら成功。

 

 

ダミーとジョイントの接続

 作成したダミーと、元のジョイントの移動、回転、スケール値を完全に同期させるために、トランスフォームアトリビュートをすべて接続する。

 

接続方法は2通りある。

  • ノードエディタで1本1本線をつなぐ
  • 接続エディタで項目を選んでつなぐ

ノードエディタの場合は、下図の赤枠部分の線を1本1本つないでいく。

f:id:Magotarou:20200308024730p:plain

 

接続エディタの場合は、下図のようなエディタ上でつなぐ項目を左→右の順番で選んでいく。

f:id:Magotarou:20200308024903p:plain

ちなみにこの接続エディタを使う場合は、左側(右側)の表示 > キー設定不可の表示のチェックマークを外すと、項目が減って見やすくなる。

 

だが、どちらの方法も数が多いと大変面倒なので、できればスクリプトで簡略化したい。

 

幸い、以下の本にそのスクリプトが載っているので、それを使っている。

現場で使えるMayaスクリプティング

現場で使えるMayaスクリプティング

 

 

 接続(1:1の場合)はチャネルが黄色になる。

f:id:Magotarou:20200308120508p:plain

 

 

 

スプラインIKの作成

ここからはダミージョイントに対して作業する。

メニューをリギングにして、

ケルトン > IK スプライン ハンドルの作成オプション

f:id:Magotarou:20200308120920p:plain

オプションの設定は以下。

 f:id:Magotarou:20200308121226p:plain

 

スパン数は、作成されるカーブのcv数が『3+設定した値』になる。

cvの数がそのままコントローラの数になるので、足りないと思ったら多めにしてもいい。

 

 ビュー上でD_joint1>D_joint_Effの順に選択するとハンドルとカーブが作成される(アウトライン上の選択では機能しないのが不便)

f:id:Magotarou:20200308172939p:plain

 

D_Rootではない。D_Rootはカーブそのものを動かすために使う。



 

クラスタハンドルの作成

クラスタというものを作って、これで間接的にカーブを操作する。

作成されたカーブを選択して、

メインメニュー > 選択>クラスタカーブ

を実行すると、カーブのCVのところに『Cluster数字Handle』というオブジェクトができる。

 

f:id:Magotarou:20200308172737p:plain

というか、このコマンドなんでメニューのこんなとこにあるの。

 

試しにクラスタハンドルを選択して動かしてみて、カーブの動きとメッシュの動きが連動するか確認する。

f:id:Magotarou:20200308172847p:plain



 

ここまで来たら、あとはこのクラスタを操作するコントローラを作ればいいだけになる。

自動で作成された『ikHandle』『ClusterHandle』は全部Dummyグループの子にしてまとめる。

 

コントローラの作成

コントローラに使うためのカーブオブジェクトを作成する。

作成法は割愛するが、以下のリンク先でスクリプト化まで含めたコントローラオブジェクトの作成について詳しいので参考にした。

 

Maya; Python で Rig用 ICON を作ろう!!

https://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_07/

 

必要な分だけカーブを作る

f:id:Magotarou:20200308142849p:plain

 

グループ化して名前を変更

名前はわかればいい。

作ったカーブをグループ化したあと、グループノードをhandleの位置に合わせる。

f:id:Magotarou:20200308185423p:plain

 

カーブは親子にしないほうが動かしやすいので並列(正しいかは知らない)。

 

合わせたハンドルとダミージョイントをペアレントコンストレイントして、親子構造を変更する。

コンストレイントのつなぎ順は以下の通り。

Ctrl_Root > D_Root

Ctrl_cluster1 > cluster1Handle

以下略

 

f:id:Magotarou:20200308194822p:plain

 

 

クラスタをグループにまとめてグループをD_Rootの子に移動。

 

完成

コントローラに移動アニメーションをつけて動かせるようになった。

f:id:Magotarou:20200308214515g:plain

 

2022/10/06 追記:

上の動きに加えてCtrl_Rootに移動アニメをつけると、全体が動きます。

 

おまけ:ツイストの追加

実はこのままだとねじれ表現ができない。

とりあえずねじれ用のコントローラを作成して追加する。

f:id:Magotarou:20200308224333p:plain

 

ねじれは、ikHandle1のアトリビュートで設定する。

f:id:Magotarou:20200308224542p:plain

ツイストタイプを『イーズイン/アウト』にして、ツイストに値を入れると、カーブの終端に向かって徐々にねじれるようになる。

この『ツイスト』に、先程作成したコントローラのY軸回転を1:1で接続する。

f:id:Magotarou:20200308224941p:plain

 

これで行けると思ったのだが、コントローラの回転とねじれの回転が逆になってしまったので、エクスプレッションで-1をかけた値がツイストに入るようにした。

 

エクスプレッションエディタは、ツイストの数値の欄で右クリックして『新規エクスプレッションの作成...』で開ける。

接続を解除してから開いて、以下のように設定する。

f:id:Magotarou:20200308230050p:plain

 

Ctrl_Twistは移動されても困るので、移動チャネルはロックしておこう。

f:id:Magotarou:20200308231618p:plain

 

ツイストの完成

コントローラのY軸回転で 鎖がねじれるようになった。

f:id:Magotarou:20200308230356g:plain