2022/05/11

NURBS Surfaceを用いて滑らかなシルエットを再現する

はじめまして。
BACKBONEの谷です。

今回は、NURBS Surfaceを用いたデフォーム表現についてご紹介します。

 

はじめに

尻尾や紐のような形状のウェイト調整で苦労された経験はないでしょうか。
例えば、紐のような形状のモデルを3本のジョイントでバインドする場合、
下記2点に注意してウェイトを調整する必要があります。

・複数のジョイントを選択して回転した際のシルエット
・単一のジョイントを選択して回転した際のシルエット

下の動画のように、3本のジョイントを選択して回転した際に、
ガタガタとした硬いシルエットになるのは避けたいですね。

ウェイトの影響範囲を広げつつ調整すると、滑らかなシルエットになります。

しかし、単一のジョイントを選択して回転した際のシルエットを確認すると
形状がジョイントの外側に膨れるようなシルエットになっています。

拡大

ウェイト調整に時間をかけて、どれだけ綺麗に調整しても、
上記の「形状が外側に膨れる現象」は解消できません。

複数のジョイントを選択して回転したシルエットと
単一のジョイントを選択して回転したシルエットを
何度も行き来して調整するのは、とても時間がかかります。

形状が外側に膨れる現象を回避しつつ、
ウェイト調整を自動処理で効率化する

には、NURBS Surfaceが有効です。

NURBS Surfaceを使用することで、
複数のジョイント制御でも単一のジョイント制御でも
形状が外側に膨れることなく、滑らかなシルエットを再現することができます。

では、実際に設定していきましょう。

 

設定方法

①. バインドするMeshとベースジョイントの用意
細長いCubeと4本のジョイント(以後ベースジョイント)を作成します。

 

②. NURBS Surfaceの作成
各ジョイントにスナップしてCurve(Curve degree:3 Cubic)を作成します。
次に作成したCurveを複製し、それぞれのCurveがジョイントから同距離になるように配置します。
2つのCurveを選択して、
Modelingメニュー > Surfaces > Loft
を実行してNURBS Surfaceを作成します。

NURBS Surfaceのパラメータ範囲を0~1に変更します。
※パラメータ範囲を0~1に設定することで、後述のFollicleの管理がしやすくなります。

NURBS Surfaceを選択して、
Modelingメニュー > Surfaces > Rebuild
を実行します。

 

③. NURBS Surfaceと3本のジョイントをバインドする
各CVに隣接するジョイントにWeightを1.0で設定します。
ジョイントを動かすと、NURBS Surfaceがジョイントの
内側に沿うように綺麗にデフォームしていることが確認できます。

 

④. NURBS Surface上に接着するジョイントの作成
モデルの各エッジループの中心にジョイント(以後folJoint)を作成します。


今回のMeshは両端のエッジを含めて10本エッジがあるので、10個のジョイントを作成します。

この際、ジョイントの軸はベースジョイントに合わせてください。
理由については手順⑧でご説明します。

 

⑤. 前述④で作成したジョイントをNURBS Surfaceに接着させる準備
NURBS Surfaceを選択した状態で、
FXメニュー > nHair > create Hair
を実行します。
10個のfolJointを作成したので、Follicleも同数の10個作成します。


Follicleを作成した際に、同時に作成されるhairSystemやnucleus、
pfxHairは使用しないので削除して
Follicleのみ残します。

 

⑥. FollicleをfolJointの位置に配置する
Follicleの位置がfolJointの位置とズレているので、
folJointと同じ位置になるように設定します。

Follicleの位置は各FollicleのParameter Uで設定します。
folJointのそれぞれの位置を取得するために、
closestPointOnSurfaceを使用します。

closestPointOnSurfaceを作成して
NURBS SurfaceShapeのLocal
closestPointOnSurfaceのInput Surfaceを接続します。

次に、folJointのTransleteclosestPointOnSurfaceのIn Positionを接続します。

folJointが10個あるので、各folJointに対して上記同様の設定を行います。
closestPointOnSurfaceから取得したParameter Uの値をコピーして、
対応するFollicleのParameter Uにセットします。

各Follicleに該当するfolJointをペアレントします。

NURBS Surfaceの動きにfolJointが連動する仕組みができました。

 

⑦. 10個のfolJointとMeshをバインド
それぞれのfolJointに対応するエッジのWeightを1.0で設定します。
滑らかで綺麗なデフォームを実現できました。

 

⑧. 忘れがちなScaleの対応
ベースジョイントをScaleすると、
Scale Xのみ形状が変化していることが確認できます。


モデル ⇒ folJointにより制御 ⇒ NURBS Surfaceにより制御 ⇒ ベースジョイントにより制御
といった構造なので、この形状の変化はNURBS Surfaceのデフォームによる変形、
つまり
folJointの移動による変形です。

folJointのScaleY、ScaleZは別に設定する必要があります。

ベースジョイントとそれに該当するfolJointのScaleY、ScaleZをそれぞれ接続します。
④でベースジョイントとfolJointを同じ軸にしているので、
Scaleした際の挙動が正しく再現できます。
Scale Y、Scale ZでもScaleできるようになりました。


Scaleした際の形状をより滑らかにしたい場合は、
ベースジョイントからの距離に応じてfolJoint
のScale値を相対的にブレンドする必要があります。
ブレンドするためのノードを用いて接続することでScale値を調整できます。

 

補足

■ モデルがハイメッシュの場合について
モデルが複雑な形状の場合には、モデル
に対してLatticeを適用して
Latticeの各格子ポイントにfolJointを設定することで対応できます。

 

■ Follicle以外の手法について
Follicle以外の手法としては、Maya2020から実装されました
UV Pinやサーフェイスコンストレインなど他の手法を用いることも可能です。
パラレル評価を考慮して色々と試してみて下さい。

 

まとめ

今回はデフォームの調整方法の一つとして、
NURBS Surfaceを用いた手法をご紹介させていただきました。

形状が内側に沿うので少し形状が縮むといった欠点はありますが、
柔らかいシルエットを作りやすく、機械的な操作でウェイトを調整する事ができるので
用途次第では非常に効率的かつ効果的な手法です。

また、作例からも分かるように
制御用の骨の数がバインド用の骨の数より少ない場合でも
滑らかなシルエットを再現できるというメリットもあります。

ぜひ試してみてください。

 

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

 

 



ブログTOPへ戻る