背骨(FKIKハイブリッド)のセットアップの仕上げ編です。
過去の記事をまだご覧になっていない方は過去の記事から御覧ください。


全体スケール対応して実際に使えるようにします。
全体スケール対応については過去の記事に書いてありますのでこちらも参考にしてみてください。

階層構造のおさらい
今回の作例では階層構造を意識して作ってきたので現時点でもきれいになっています。

「joint_Grp」にはjointが入っています。
モデルにスキニングされる「skin_joint」とリグをつけるためにある「rig_joint」の2つがあります。
「rig_joint」を動かす(driver)ことによって「skin_joint」が動かされる(driven)ようにtranslate(X,Y,Z)、rotate(X,Y,Z)、scale(X,Y,Z)の値が接続されています。
1つずつ接続するのは大変なので私の自作スクリプトを使用しました。

このような構造にすることによって「skin_joint」と「geo_Grp」を別の人に渡してスキニング作業を担当する人と、「rig_joint」と「ctrl_Grp」を使用してリグを作成する人とで容易に作業分担することができます。

「ctrl_Grp」にはリグのコントローラーが入っています。
「dnt_touch_Grp」にはアニメーターに触られては困るものを入れています。基本的には非表示にして隠してしまいます。最終的には「ctrl_Grp」の中に入れてしまったほうがすっきりしますが、わかりやすいように今回は外に出しておきます。
「geo_Grp」はキャラクターのジオメトリが入っています。
全体スケール対応の準備
「root_Ctrl」という名前で全体の移動、回転、スケールのコントローラーを作成します。ここでは大きなnurbs Circleを使用しました。

コントローラーなので階層は「ctrl_Grp」の中にいれます。

全体をコントロールするものなのですべてコントローラーの親にします(pelvis_Ctrlとchst_Ctrl_Grpとhip_Ctrl_Grpの親にします)。
そしてScaleもコントロールするためにリグ用jointのグループである「rig_joint」のScaleに「root_Ctrl」のScaleを接続します。
これで(とりあえず)全体Scaleの設定ができました。
全体スケールの問題発生
「root_Ctrl」をScaleすると問題があることがわかります。
この動画のようにchestのコントローラーを突き抜けて拡大したり、また、chestのコントローラーよりも小さく縮小してしまいます。
なぜこのようになってしまうのでしょうか?

それは「root_Ctrl」をScaleしただけなのにリグ用のjointである「spine_**_Jnt」のscale Xの値が反応してしまいjointが伸び縮みしてしまうことが原因でした。
修正方法
全体スケールの影響をリグ用のjointには影響しないようにしなければなりません。
現状では「root_Ctrl」を2倍するとリグ用のjointのScale Xも2倍になってしまいます。
この関係を打ち消してやることでScaleのnormalizeを行います。

Stretch用のmultiplyDivideノードの前にnormalize用のmultiplyDivideノードを作成します。名前は「spine_normalize」としました。
spline_IKのカーブの「curveInfo」のArc Lengthを「spine_normalize」のInput 1Xに接続します。
そして「root_Ctrl」のScale Xを「spine_normalize」のInput 2Xに接続します。
そうしたら「spine_normalize」のOutput XをInput 1Xを「(Stretch用の)multiplyDivide」のInput 1Xに接続します。

「spine_normalize」のMultiply-Divide AttributeのOperationを「Divide」にします。
これで上手くいったかと思えば縮小したときに問題が発生しました。
Scaleの値が0.5より小さくなるとcylinderが細長く伸びてしまいました。
試行錯誤した結果‥。

「dnt_touch_Grp」にあるカーブにbindした2つのjointに問題があることがわかりました。
そこでこの2つのjointを「dnt_touch_Grp」から「joint_Grp」の「rig_joint」の中に移動したところ上手くいくようになりました。
さらなる改良
Squash and Stretchをする場合に物体の質量は変化しない(上下に潰されれば横にそのぶん広がる。その逆も)というこの質量保存の法則をこのリグに実装してみます。
$$ Scale Y = \frac{1}{\sqrt{Scale X}} $$
$$ Scale Z = \frac{1}{\sqrt{Scale X}} $$
この数式をNode Editorに実装します。

新たにmultiplyDivideノードを2つ追加します。
Scale XのStretch用のmultiplyDivideノードのOutput Xを「spine_power(追加したmultiplyDivideノード1)」のInput 1Xに接続します。
その出力であるOutput Xを「spine_stretch_inverse_DIV(追加したmultiplyDivideノード2)」のinput 2Xに接続します。
その出力のOutput Xをそれぞれの「spine_**_Jnt(それぞれのリグ用背骨joint)」のScale YとScale Zに接続します。
2つあるそれぞれのmultiplyDivideノードの設定は以下の通りです。
1つは「spine_power」と名前をつけてOperationを「Power」にします。

input 2Xに0.5(二分の一)を入れると「√(ルート)」として計算され、2を入れると2乗として計算されます。
ということでここでは0.5を入れます。
もうひとつのmultiplyDivideノードは「spine_stretch_inverse_DIV」と名前をつけます。
こちらのOperationは「Divide」にします。

Input 1Xには1.0を入れます。
このように質量が保たれるようになりました。


今回の記事が気に入っていただけた場合、ぜひとも他の記事もチェックしてみてください。Mayaのリギングに関する記事をまとめたページです。


コメント