Mayaで背骨(FKIKハイブリッド)のセットアップ -後編-

spine_hybrid_kouhenMayaでRigging

背骨(FKIKハイブリッド)のセットアップの仕上げ編です。

過去の記事をまだご覧になっていない方は過去の記事から御覧ください。

Mayaで背骨(FKIKハイブリッド)のセットアップ -前編-
「背骨のセットアップなんてものはすべてFKでええじゃないか」という(アニメーターの)意見があることは存じています。しかも、そのような意見が少なくないことも。リグを作る立場からすれば楽なので良いのですが(退屈だと思われる方もいらっし...
Mayaで背骨(FKIKハイブリッド)のセットアップ -中編-
背骨(FKIKハイブリッド)のセットアップの続きです。前回までで背骨のspline_IK(IK_spline)を作成し、そのspline_IKのカーブにjointをバインドし、そのjointにコントローラーをつけるところまで作成し...

全体スケール対応して実際に使えるようにします。

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

MayaでStretch IK(scaleX版)part2(全体スケール対応)
Stretch IK(伸びるIK)の解説 (scakeX版)の続きです。前回ではとりあえずstretch IKが完成したと思ったのですが、全体のスケールに対応できていませんでした。全体スケールを伴わないリグの場合は前回までのもの...
スポンサーリンク

階層構造のおさらい

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

「joint_Grp」の階層

「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つずつ接続するのは大変なので私の自作スクリプトを使用しました。

Mayaでアトリビュートを接続するスクリプト
MayaでRigging(Basic編)で紹介した自作スクリプトの使い方について解説します。このスクリプトは名前の通りアトリビュートをコネクトするツールです。 MayaでRigging(Basic編) でも説明しましたが、...

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

「joint_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に接続します。

Scaleの影響を打ち消すために「Divide」にする

「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を入れます。

このように質量が保たれるようになりました。

Follow me!

コメント

PAGE TOP
タイトルとURLをコピーしました