Clothの最適化を調べると詳しい人が書いてくれた記事が出てくる。しかし、その記事は古いものであったり、言葉が汚かったり主観的であったりするため読んでいて気持ちのいいものではない。
そこで、そのような記事等を参考にしながら僕(keipii)が得た知見をつらつらと書き連ねていく。
これからも、実験や各種情報などによって随時更新していく予定。
まず頭に入れてほしいのは完全無欠の完璧な設定を出すことは不可能であること、トライアンドエラーの塊であること。
用語
- パーティクル:Clothコンポーネント配下にある頂点の呼び方。
- NvCloth:nVIDIAが提供するClothシュミレーションエンジン。Unity2018以前ではPxClothを使用していた。
各種パラメータ
Unity DocumentationとNvCloth Documentationを出来る限りかみ砕いた説明。
()内は憶測。
- Stretching Stiffness:伸びやすさ(隣り合った頂点が動ける距離の制約)
- Bending Stiffness:曲がりやすさ(1つ飛んで隣り合った頂点が動ける距離の制約)
- Use Tethers:テザー制約の適用、メッシュが伸びすぎるのを防止する
- Use Gravity:重力加速度の適用
- Damping:減衰係数、大きくすると揺れの収束が早くなる
- External Acceleration:外部から一定に加えられる加速度(恐らくNvClothのWind simulation)
- Random Accelaration:外部からランダムに加えられる加速度(恐らくNvClothのWind simulation)
- World Velocity Scale:ワールド空間でのオブジェクトの速度がパーティクルに与える影響
- World Acceleration Scale:ワールド空間でのオブジェクトの加速度がパーティクルに与える影響
- Friction:コライダーとの摩擦係数
- Collision Mass Scale:頂点の質量
- Use Continuous Collision:衝突判定の精度が上がるが、計算量は2倍になる
- Use Virtual Particles:バーチャルパーティクルによって衝突判定の密度を上げる
- Solver Frequency:演算の頻度で単位はHz、計算量は比例して増加する
- Sleep Threshold:Sleep(演算がされない)状態になるための閾値
- Capsule Colliders:カプセルコライダーの設定
- Sphere Collider:スフィアコライダーの設定、テーパーカプセル(後述)の設定
- Virtual Particle Weights:バーチャルパーティクルの位置、バーチャルパーティクルは周囲の3頂点から生成される
- Constraints:パーティクルごとの制約、後述
- Self Collision/Inter Collision:頂点同士の衝突判定
Cloth Constraints
- Max Distance
- パーティクルが移動できる距離(半径)0~∞。(単位はm)
- パーティクルがMax Distanceで設定した値に達するまではBlenderで言うところの頂点グループによる制約を受けない。
- Max Distanceが0の場合は常に頂点グループによる制約を受ける
- 例として、Max Distanceが0.1の場合はパーティクルが10cm動いた場合に初めて頂点グループによる制約を受ける
- NvClothを用いているUnity2019.4.xにおいてCloth Componentのオンオフをした場合、頂点グループによる制約を受けた後にClothの演算が始まる。
- Surface Penetration
- 恐らくNvClothに存在しないUnity独自の機能。
- 直訳すると表面浸透、パーティクルがメッシュにどれだけめり込めるか0~∞。(単位はm)
- パーティクルが侵入できない領域を指定する。
- この制約の中心ははMax Distanceを2倍し、そこからSurface Penetrationの分オフセットした位置に依存している。(下記、原文ママ)
PhysX only allows us to use sphere shaped separations constraints, so actually per each mesh vertex we configure a sphere of radius equal to twice the value of max distance constraint centered at twice the max distance constraint plus surface penetration value along the negative direction of the normal. [5]
上記の理由により、Max Distanceが∞の場合Surface Penetrationも無限となるためパーティクルが存在できなくなり、NaNとなる。
Self Collision/Inter Collision
- Self Collision
- 同一オブジェクト内の周囲のパーティクルとの衝突判定
- Inter Collision
- 複数のClothオブジェクトのパーティクルとの衝突判定
- 計算の反復回数が増える
- 計算量が増大するためパフォーマンスに非常に大きな影響を与える
メッシュの形状、トポロジー
- パーティクルの数は2000以内に収めるのを推奨する
- メッシュに鋭角を作らない
- Unityで自動的に三角形のポリゴンに分割されるが、Clothは辺に沿って折れ曲がる挙動をするので細かいところはBlenderを使って手動で三角ポリに割るのを推奨
- Clothを適応するメッシュには厚みを持たせず、ペラペラのままにする
Clothコンポーネントの設定
パラメータの設定
ふつうのスカートの場合、これを基準に微調整をするといい感じになるはず
ただし、以下のパラメータは画像のまま設定する
- Use Tethers
- パラメータの解説を参照
- Use Gravity
- パラメータの解説を参照
- Use Continuous Collision
- パラメータの解説を参照
- Use Virtual Particles
- パラメータの解説を参照
- Solver Frequency
- VRCにおいては90の倍数が望ましいため
- Sleep Threshold
- 閾値の最大が1
また、以下の値は触らない
- Virtual Particle Weights -> Element 0,Element 1,Element 2
Virtual Particle Weights -> Sizeは3に設定する。理由はパラメータの解説を参照
Cloth Constraintsの設定
赤 Max Distance:0
ピンク Max Distance:0.07
オレンジ Max Distance:0.2
黄 Max Distance:0.3
緑 Max Distance:0.4
一番上のMax Distanceは0にしないと無限に落ちていく
Max Distanceが0のところのみ頂点グループHipsにウェイト1を乗せている
プリーツ、末端部分のMax Distanceを落とすことでまくれ上がらなくなった
Surface Penetrationは特に設定していない
設定する際、Constraint Sizeを0.01くらいにすると作業がしやすい
Self Collision/Inter Collisionの設定
計算量が増大し、パフォーマンスに影響が出るため設定していない
Collidersの設定
Tapered Capsule Colliderを使用している
Tapered Capsule ColliderはSphere Colliders -> Element -> First,Seecondを設定すると生成できる
画像内のコライダーの配置は
- CCL_1:Hips
- CCR_1:Hips
- CCL_2:Left leg
- CCR_2:Right leg
- CCL_3:Left leg
- CCR_3:Right leg
となっており、それぞれFirst、Secondに参照させている
配置は改善の余地あり
Capsule Colliderと違いColliderに隙間ができないため引っかかるような挙動が無くなる
未検証
- 貫通しない多重Cloth
- 一番効率的なメゾットはそれぞれの層にClothコンポーネントを当て、Inter Collisionを設定することだが、計算量が増える
- そのため各層に対してコライダーも層のように設定する
- 安定した挙動でつまめるスカート
- Frictionを大きくし、Capsule Colliderで実装する
サンプル画像
- キュビクローゼット「オリジナル3Dモデル「狐雪」Ver.1.04」
- Vinsen「【VRChat想定衣装モデル】Classic fit for koyuki」(調整済み)
参考文献
[1]Unity Documentation
[2]【VRC向け】きれいで低負荷なClothを作る為の最低限の前提知識。
[3]説明書に載ってない本当のClothコンポーネント ~VRChatで使うClothコンポーネント~
[4]NvCloth Documentation
[5]UnityAnswers