mayaリギング/忘備録♯02:コンスト編
■はじめに
これはmaya触るのが初めてに近い筆者が、リグをある程度作れるまでの知識をまとめた記事群だ。
自分の為の忘備的な側面が強く、「読めば"覚えたレベルに戻れる"まで」をコンセプトに、技術的なところを具体的に記していく。
●この記事の内容
・IKリギング
・コンストレイント/極ベクトル
・コンストレイント/オリエント(方向)
・【コンストレイントは競合できない】
その前に本項の学習で使うモデルについて紹介しておく。
本項ではひとつのジョイントに対し100%のスキンウェイトを持った動物用の足モデルを使用し、IKの学習をしていく。
(ボーンがあればモデルがなくても可能な項目なので、私の作業を追いたい場合はこの形状で3点ジョイントだけ設定いただければ)
私が業務でリギングを求められたとき完成した四つ足リグでの作業を求められた故だが、その代替としてこのようなモデルを使う。
このモデルの特徴として【つま先のボーンがない】事が挙げられる。
筆者自身が困ったことでもあるのだが、実はこの【つま先のボーンがない】ケース、スマホのような負荷を落としたい構造が求められるモデルだと要件として頻出する。
しかしネットの教則や本を読んでも【つま先にボーンがない】場合のリギングケースは紹介がされていないので、筆者の解決方法も交えてIKとコンストレイントについて学んでいこうと思う。
■1:IKリギング
IKは二つ以上のジョイントがある状態で成立する。
早速IKを設定していくが、IKハンドルのツール設定を見ると色々な項目があって困惑する。
わからないままは怖いだけなので、ざっくりと専門用語に関して用途を説明していく。
シングルチェーンソルバ:耳や首など途中で明確な関節がない単純な構造に適している。
回転プレーンソルバ:腰から足、肩から腕など複雑な構造に適している。腕足は極ベクトルを使う都合上まずこれ。(※1)
ソルバ:有効化しないとそもそもIKの挙動をしないので基本的に有効。
スナップ:IKハンドルの位置を終端に固定(スナップ)する。
基本的なリギング作業では有効のまま使うだろう。
これの説明は難しいので下記のブログを読むとわかりやすい。スナップを使わないことでIKハンドルを別の位置にキー打ちできるようになる。
スティッキー:こちらを有効にすることで終端の位置が上端の移動に対して固定化される。これを設定しないと末端ジョイントを地面方向に移動するとそのまま埋まる。基本的なリギング作業では有効のまま使う。
■下記がスティッキー有効の状態
■下記がスティッキー無効の状態
IKを設定する場合、下記のようなフローで行う。
-----------------------------------------------------------------------------------
●作業手順
1:メニュー → スケルトン → IKハンドルの作成。カーソルが十字マークに変化する。
2:腰側を始点にするため根元ジョイントをクリック。
2:先端のジョイントをクリック。
-----------------------------------------------------------------------------------
これでIKは成立する。
アウトライナを見ると「ikHandle1」が表示されている。これが【IKコントローラー】だ。
ikHandle1をクリックして移動モードにすると先端からマニュピュレーターが出ているのがわかるだろう。
「足のジョイント構造の【移動をIKがコンストレイント(拘束)】した」と覚えておいてほしい。
後々IKというものがどういうものなのかを本項で説明する。
■2:コンストレイント/極ベクトル
二足モデルも四足モデルもただIKを設定しただけだと、"ひじ"の方向を制御できず一定の向きしか向かない。
この為、関節部のIK作業は殆どの場合【極ベクトルコンストレイント】を使った【関節方向の指定用マニュピュレーター】を製作し、下記のようにフレキシブルにポージングできるリグを作る。
本記事でのもう一つの大項目【コンストレイント】について作業をしながら学んでいこう。
-----------------------------------------------------------------------------------
●作業手順
1:前回の記事で使った【rig101ワイヤーコントローラー】を立ち上げ、Prisms→Spear→controller1が生成。
コントローラーの形状はわかりやすければ何でもよい。
2:controller1を選択。Vを押しながらスナップ移動を行い、joint2の原点へ。そこからcontroller1を肘の先方向の適度な距離に水平移動。
3:メニュー→編集→種類ごとに削除→ヒストリー。メニュー→修正→トランスフォームのフリーズ。原点系と履歴を綺麗にする。
3:controller1、ikHandle1の順に選択。メニュー→コンストレイント→極ベクトル。【コントローラーの完成】。
-----------------------------------------------------------------------------------
完成したcontroller1を動かすとこのようにひじの方向がついてくるようになる。
コンストレイントの基本「拘束」だ。
コンストレイントの各項目は意味合いこそ異なるが基本的に「あるオブジェクトにある仕組みを関連させてその動きを拘束/制御」するために使用する。
ここでは回転プレーンソルバの方向ベクトルをコントローラーに拘束(コンストレイント)することでIKの軸回転を制御するコントローラーを作成した。
■3:コンストレイント/オリエント(方向)
だいぶ【足モデル】のリギング作業が進んできたが、一つ問題がある。
以下のスクリーンショットを見てほしい。
肩部分が下がり地面方向に肘が曲がると、踏ん張るはずの足先のパーツが上に回転してしまっている。
これはjoint3がIKの動きに対して回転してしまっている為だが(ボーンだけのケースでもjoint3が縦回転しているのがわかるだろう)、このままではroot方向のコントローラーを沈ませたときにいちいちつま先の回転にキーを入れて踏ん張りの形状制御をしなくてはならない。
最初に話したが、これが【つま先にボーンがない】場合のリギングケースにおける問題点だ。つま先ジョイントがあるリギングとは別の解決法を探る必要がある。
●以下は【つま先にボーンがある】場合のつま先とかかと構造のIK固定例。
足首からかかとのジョイントを別のIKで固定している為、腰方向が下がってもつま先が動かない。
ここからは足首にコントローラーを設置し、そのコントローラーで足首の固定/制御をする【コンストレイント作業】を行う。
-----------------------------------------------------------------------------------
●作業手順
1:アウトライナ上で何も選択していない状態でCTRL+Gでnull1を製作。null1をfoot_ctr_dummyにリネーム。Vを押しながらスナップ移動を行い、joint3にスナップ。
2:joint3とコントローラーの回転値/ジョイント方向を一致させるためにjyoint3、foot_ctr_dummyの順で選択。メニュー→コンストレイント→方向コンストレイント□。オフセットの保持をオフ。
回転の値がjoint3から取得され、青くなったのがわかる。(※2)
3:アウトライナ上でfoot_ctr_dummy内に作られたfoot_ctr_dummy_orientConstraint1を削除する。foot_ctr_dummyに回転の値は得られたので必要ない。
4:【rig101ワイヤーコントローラー】を立ち上げ、Prism→Cubeでcontroller2を作成。リネームでfoot_ctrとする。shift+右クリックでビューを【左面ビュー】に切り替え。スケールXYZを6に。下記のスクリーンショットにあわせて底面が0座標に合うように上に移動、次はVを押しながら横にスナップ移動でjoint3の縦位置とあわせる。
5:Dキーを押してピボット移動モードに。Vを押しながらjoint3の原点にctrのピボットを移動。
6:foot_ctr、foot_ctr_dummyの順で選択。Pキーでペアレント化。foot_ctrのみを選択し、メニュー→修正→トランスフォームのフリーズ。コントローラーの座標を0ベースにする。
7:foot_ctr、joint3の順に選択し、メニュー→コンストレイント→方向コンストレイント□/オフセットの保持。【コントローラーにjoint3の回転の値を拘束】
8:最後にikHandle1、foot_ctrの順で選択し、Pキー。【コントローラーにIKの移動の値を関連付け】。これでコントローラーに【回転と移動】が付与された。
階層構造は以下のようにする。
これで足の【コントローラーの完成】。
-----------------------------------------------------------------------------------
出来たコントローラーを触って動かしてみよう。
移動すると極ベクトルコントローラーの位置に拘束され肘方向がきちんと制御されている。
root方向のジョイントが下に動いてもつま先は回転せず地面に固定されている。
またつま先も軸回転で方向を変えられる。要件を満たした良いコントローラーが作成できた。
■4:【コンストレイントは競合できない】
とんとん拍子で進んでいるように見えるが、ここで私がやらかしたミスを記しておく。
そもそも【コンストレイントとは何か?】という不理解故に起きたことだ。
具体的な作業手順をしめす。【3:コンストレイント/オリエント(方向)】の項目の作業の途中から振り返ろう。
この項目では【オリエント(方向)コンストレイント】ではなく【ペアレントコンストレイント】を使う。
-----------------------------------------------------------------------------------
●作業手順
6:foot_ctr、foot_ctr_dummyの順で選択。Pキーでペアレント化。foot_ctrのみを選択し、メニュー→修正→トランスフォームのフリーズ。コントローラーの座標を0ベースにする。
7:foot_ctr、joint3の順に選択し、メニュー→コンストレイント→ペアレントコンストレイント/オフセットの保持。
おや⋯⋯? エラーが出た。
構わず8の作業へ。
8:最後にikHandle1、foot_ctrの順で選択し、Pキー。
-----------------------------------------------------------------------------------
【コントローラーが完成】した。
見る限り同じように完成した居るように見えるが⋯⋯。触ってみよう。
コントローラーを掴んで上方向へ。あれ⋯⋯?
何が起きているのだろう? モデルとjoint3が分離して動いている?
⋯⋯さて、前項目で
7:【コントローラーにjoint3の回転の値を拘束】
8:【コントローラーにIKの移動の値を関連付け】
というカッコつき注釈を入れた。
そしてIKリギングの項で「足のジョイント構造の【移動をIKがコンストレイント(拘束)】した」とも書いた。
これが重要な意味を持ってくる。
【ノードエディタ】を見てみよう。
アウトライナでikHandle1を選択、メニュー→ウインドウ→ノードエディタ。
このような画面が出てくる。
ノードエディタはオブジェクトとオブジェクトがどのような項目でつながりあっているかを視覚的に示したものだ。
ノードの右の方に三本の灰色の線があるので、これをクリックするとノードを展開できる。
ノードは入力と出力で構成されており、入出力をみればどこが起点となって動きを制御しているのかがわかる。
さて、ikHandle1を展開してみよう。
【joint3_parentConstraint1から移動と回転の出力が伸びてjoint3に接続】されている。
そして【joint3からIKの実質的なコントローラーであるeffector1に移動が接続】されている。
この構造をよく覚えていてほしい。
さて、【3:コンストレイント/オリエント(方向)】の構造を見てみよう。
【joint3_orientConstraint1からは回転のみの出力がjoint3に接続】され、
【【joint3からIKの実質的なコントローラーであるeffector1に移動が接続】されている。
この違いが原因だ。
先ほど出たエラーはjoint3のサイクルエラーを示唆していた。
二つの違いは何か? 【移動命令の多重化】だ。
ペアレントコンストレイントは【移動と回転】を拘束できるコンストレイント系で、もともとjoint3の移動系は「足のジョイント構造の【移動をIKがコンストレイント(拘束)】」し、制御していた。
つまり、コントローラーと「IKコントローラーであるeffector1がくっついたjoint3」をペアレントコンストレイントしたせいで、コントローラーとIKの移動命令がバッティングを起こし、移動命令サイクルに異常が出たのだ。
この項目の大項目である【コンストレイントは競合できない】とはそういう事だ。
一つのステータスの拘束系は一つに仕組みに対して一つの命令しか受け付けられない。
移動をIKで制御したのならば移動を他の拘束系で制御できない。
7:【コントローラーにjoint3の回転の値を拘束】
8:【コントローラーにIKの移動の値を関連付け】
と各々の制御系で制御を分けて、最後にコントローラーに違う制御系を【ペアレント(親子付け)】することで違う制御系をまとめて一つのコントローラーで動かす。
コントローラーのこのレイヤー構造はその仕組みを階層的に視覚化している。
【コンストレイント】を扱う際はくれぐれもこの基本的な仕組みを覚えておく必要がある。
■5:♯02まとめ
IKの作り方とコンストレイントの基本を学んだ。
♯01まとめでも話したが、コンストレイントだけに操作を依存せず、ペアレントも有効活用することで制御系を分け合う方法を理解できたはずだ。
ペアレントだけでもコントローラーは成立する。リギングはロジカルなものなので、きちんと設計して競合が起きないように作っていこう。
次は「IKスプラインハンドル」と「ドリブンキー」に関して学んでいきたい。
●♯02注釈
※1:【コンストレイント/極ベクトル】で行った膝用マニュピュレーターリギングはシングルチェーンソルバでは設定出来ない。やろうとすると以下のエラーが出る。このため腕足のIKでは回転プレーンソルバを使う。
※2:joint3はジョイントのフリーズでもともと綺麗な値にしていたのでall0のまま動いていない。足首のジョイントが横回転した際軸が傾いていると足首が地面にめり込んでしまうためだ。この作業はジョイントとコントローラーの軸を一致させたいという要件によっては意味を持ってくるので、本件では重要な作業ではないが、リグの構造フォーマットとして入れ込んでいる。