Stretch IK(伸びるIK)の解説 (scakeX版)の続きです。
前回ではとりあえずstretch IKが完成したと思ったのですが、全体のスケールに対応できていませんでした。全体スケールを伴わないリグの場合は前回までのものでも問題ないかもしれませんが、この問題を解決しなければ実用には耐えられません。
前回の記事を読まれていない方はまず前回の記事を御覧ください。

全体スケールの対応に苦労されているかたは、もしかしたら前回の記事を読まなくても参考になるかもしれません。
前回のStretchIK
前回の記事で作成したStretchIKを全体スケールすると上の画像のようにIKの腕が折れ曲がってしまいます。

こちらが前回のStretchIKで組んだノードです。
このノードの解説については前回の記事を参照してください。

上の画像が前回のStretchIKのシーン構成(グループわけ)です。
リグを組むときにはグループ分けが非常に重要です。
基本的には、「joint」と「コントローラー」と「触ってはいけない(触られてはいけない)もの」、そしてキャラクターにスキニングしてある場合はそのポリゴンなどの「Geometry」をひとつのグループにします。
このStretchIKの問題点
このStretchIKのどこに問題があるのかを考えます。
まず、multiplyDivideノードとconditionノードの両方にデフォルトのIKの長さとして数値(ここでは6)を直接入力していました。プログラミングの入門書にも書かれているように数値を直接いれてしまうとあとでそれに変更を加えたくなったときにすべての値を書き換えなければなりません。変数などの可変なものを用意するべきです。
そして、このStretchIKの場合は全体スケールされることによりデフォルトのIKの長さがこのスケールによって変わってしまいます。よってこれを考慮にいれなければなりません。
可変のデフォルトのIKの長さを得る方法
大きなサークルのrootコントローラーを拡大縮小するとそれとともにデフォルトのIKの長さが変わる必要があります。

それにはrootコントローラーの子にデフォルトのIKの長さと同じもの(カーブを利用します)を配置することで解決できます。
腕のIKとなるjointの根本と先端にスナップさせてCreate > Curve Tools > CV Curve Tool(EP Curve Toolでも可)□のオプションを開いてCurve degreeを「1 Linear」にしてカーブを引きます。
このカーブをデフォルトのIKの長さの基準にします。
カーブの長さを取得する方法

Node EditorでTABキーを押して「curveInfo」と打ち込むとcurveInfoノードが作成できます。
IKの長さの基準となるカーブのシェイプノードの「World Space」を「input Curve」に接続します。「input Curve」はデフォルトでは表示されていないので左上の青い●の部分に引っ張っていってリストから「Input Curve」を選択して接続できます。
curveInfoノードの「Arc Length」というパラメーターにカーブの長さが格納されます。Attribute Editorを開いて確認してみてください。
スケール対応のStretchIK

全体を制御できるように「main_ctrl」のTranslate、Rotate、Scaleを「joint_Grp」のそれらに接続します。
ちなみに 「Translate」「Rotate」「Scale」の3つを接続する場合には私が作成したスクリプトを使用すると手間が省けます。とくに膨大な数を接続したい場合はとくにおすすめです。よろしかったら使ってみてください。

そしてcurveInfoから得た「Arc Length」を以前は数値をいれていたmultiplyDivideノードのinput2の「input 2X」とconditonノードの「Second Term」に接続します。これでスケールに応じた長さを得ることが出来ました。
これで完成です。
どうしても「dnt_touch_Grp(触られてはいけないグループ)」に入れたい場合

「dnt_touh_Grp(触られてはいけないもの)」 に入れたほうが美しいし、シーン構築のコンセプトにも合っています。
したがって、どうしても「dnt_touh_Grp(触られてはいけないもの)」のグループに入れたい場合はどうすれば良いのでしょうか。

multiplyDivideノードが増えてより複雑な形になりました。
ノードが増えただけではなく、接続も結構かわりました。

新たに追加したmultiplyDivideノードはroot_ctrlのスケールの値を得てそれを基準のカーブに適応します。

前からあったmultiplyDivideノードの役割はかわりません。jointのスケールを何倍にするのかを求めます。

jointの倍率が「1」より大きい場合はその倍率を、「1」より小さい場合は倍率を「1」として出力します。
まとめ
「dnt_touch_Grp」に入れるやり方はノードが増えてしまい複雑になってしまい(リガーの負担が増え)ます。しかし、コントローラーのグループにカーブ (非表示にするとしても) があると、アニメーターに触られて不具合を起こしてしまう可能性は十分にあります。後々の安全性を重視する上でも美的な面でも「dnt_touch_Grp」に入れるやり方のほうが良いでしょう。
ただし、難しいのでここまでやるのは結構時間がかかったりします(ベテランのリガーの方なら大したことないのかもしれませんが)。リグを勉強するうえではこのように試行錯誤することで経験値が確実にアップするはずなのでいろいろやってみることをおすすめします。
今回の記事が気に入っていただけた場合、ぜひとも他の記事もチェックしてみてください。Mayaのリギングに関する記事をまとめたページです。

コメント