2020/03/18
nHairを使用したセットアップ
こんにちは。
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のTranslateとRotateを繋ぎます。
このように設定しておくと、
シミュレーション結果をjoint1Offset~7_spaceにアニメーション情報として、
焼き付けることができます。
また、joint1Offset~7を使用してアニメーションの調整も行えます。
アニメーションキーであれば、レンダリング時のシミュレーションエラーや不具合などを防ぐことができます。
⑬ジオメトリをjoint1Offset~7にバインドして終了です。
髪の毛や尻尾など、ちょっとした揺れものに使えます。
まとめ
今回はjoint1Offset~7をジョイントで設定しましたが、通常はCurveで設定してオフセット用、
手付け用コントローラーとして使用することが多いです。
またローカルセットアップの概念が理解できている場合は、ジオメトリはjoint1Offset~7ではなく、
バインド用のジョイントを作成して、そちらにバインドすることを推奨します。
とてもシンプルな仕組みですが、アニメーションの表現力は格段に上がるので、
ぜひお試しください。
ではまた。
※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。