nHairを使用したセットアップ

2020/03/18

こんにちは。
BACKBONEの田淵です。

今回は学生さん向けに、nHairを使用したセットアップのご紹介です。
学生さんにとって、シミュレーションは難しいように思われるかもしれませんが、
簡易的なものであれば意外と簡単です。
リグの組み合わせにより、手付けコントローラーとの共存も可能です。
シミュレーションを行うと、動きのクオリティが格段に上がるので、ぜひ試してみて下さい。

 

 


nHair

①ジョイントを作成します。
ジョイントはX軸が子供を向くように設定しましょう。
X軸を子供に向けておくと、SplineIK
機能のAdvanced Twist Controls(根元と先端のツイストを制御できる)の設定がしやすくなります。
※Advanced Twist Controlsの説明に関しては割愛します。

 

②ジョイントにSplineIKを設定します。

 

③curve1を選択して、FX > nHair > Assign Hair System > New Hair Systemを実行します。
※curve1は、自動的にfollicle1の階層に移動します。

 

④再生すると、シミュレーションによりcurve2は動いていますが、curve1は動いていないことが確認できます。
ノードエディターでSplineIKとnHairの接続関係を確認してみましょう。
上側がSplineIK、下側がnHairの入出力です。
nHairからの情報はcurveShape2へ繋がっているので、nHairのシミュレーションによりcurveShape2
が動きます。
一方で、ikHandle1にはnHairからの情報が繋がっていません。

 

⑤curveShape2の情報をikHandle1に出力することで、nHairの情報がSplineIKに渡り、ジョイントが動くようになります。
curveShape2のWorldSpace[0]をikHandle1のinCurveに繋ぎます。
各機能の関係性は、下図のようになります。

 

⑥再生して、ジョイントが動くことを確認しましょう。

 

⑦次に衝突判定(コリジョン)の設定を行います。
衝突判定用のジオメトリを作成します。※今回はSphereを使用します。
Sphereを選択して FX > nCloth > Create Passive Collider を実行します。

 

⑧Curveに厚みを付けたい場合は、nHairを設定した際に作成されたhairSystem1のCollide Width Offsetアトリビュートの値を上げます。
厚みを視覚的に確認したい場合は、Solver DisplayアトリビュートをCollision Thicknessに変更してください。

 

⑨ジョイント全体を制御したい場合は、curve1を制御してください。
今回はジョイントの根元に別のジョイントを作成し、curve1をバインドしてみました。

 

⑩揺れ具合などの調整は、hairSystem1の各アトリビュートで行いますが、タイミング毎に調整するのは大変です。
揺れを抑えるのみであれば、BlendShapeのWeightアトリビュートを使用すると簡単に制御できます。
curve1とcurve2を選択してBlendShapeを設定し、BlendShapeのWeightアトリビュート(0~1)を調整して制御します。
下図は、Weightアトリビュートを最初のフレームは1、最後のフレームは0に設定してアニメーションした結果です。

 

⑪次に、オフセット用のジョイント(コントローラー)の設定を行います。
再生を止めて0フレーム目に戻し、初期ポーズにします。
joint1~7のジョイントを複製し、joint1Offset~7に名前を変更します。
このジョイントの親にSpaceノードをジョイントで作成します。
※Spaceノードについてはこちら

 

⑫一番親のjoint1Offset_spaceを選択し、FreezeTransformationsを実行してRotateの値をjointOrientに移植します。
joint1~7とjoint1Offset~7_spaceのT
ranslateとRotateを繋ぎます。
このように設定しておくと、シミュレーション結果をjoint1Offset~7_spaceにアニメーション情報として、
焼き付けることができます。また、joint1Offset~7を使用してアニメーションの調整も行えます。
アニメーションキーであれば、レンダリング時のシミュレーションエラーや不具合などを防ぐことができます。

 

⑬ジオメトリをjoint1Offset~7にバインドして終了です。
髪の毛や尻尾など、ちょっとした揺れものに使えます。

 

 


まとめ

今回はjoint1Offset~7をジョイントで設定しましたが、通常はCurveで設定してオフセット用、
手付け用コントローラーとして使用することが多いです。
またローカルセットアップの概念が理解できている場合は、ジオメトリはjoint1Offset~7ではなく、
バインド用のジョイントを作成して、そちらにバインドすることを推奨します。
とてもシンプルな仕組みですが、アニメーションの表現力は格段に上がるので、ぜひお試しください。
ではまた。

 

※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。