Vellum Configure Cloth [Mardini2024]



これはMardini2024のDay21 Vellum Configure Cloth の動画を視聴してまとめたものです。

[動画](https://www.youtube.com/watch?v=z0VtQKyfMpc)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7f513576-c492-f53f-172d-9eb33e5db81e.png)


[公式のサンプルファイル](https://media.sidefx.com/uploads/contests/mardini2024/moeen_videos/mardini_examples_day21_vellumclothsop.zip)


[Day20 Ragdoll Solver SOP](https://qiita.com/jyouryuusui/items/46f539741ef1f3e10f14) | Day21 Vellum Configure Cloth　|　Day22 Hair Generation



# 概要

- **Vellum Configure Cloth** は、SOPレベルのジオメトリを布として扱うためのプリセットノード  
- 布の変形を自然にするには、**Remesh** 等で三角形メッシュを均一化する方法が有効
- **Planar Patch** を使うと三角形メッシュを自動生成でき、様々な形状も簡単に作れる  
- 出力は、布としてのジオメトリ（クロス）、コンストレイント、コライダーの3種類を提供  
- 主な設定には、質量やドラッグ、ストレッチ・ベンド剛性、塑性変形（Plasticity）等が含まれる  
- **Vellum Constraint Properties** や **SOP Solver** により膨張・収縮をキーフレーム制御でき、動的アニメーションが可能
- **Vellum Soft Body** や **Vellum Balloon** と組み合わせると、柔らかい物体や風船状シミュレーションを簡単に実装可能


# サンプルファイル

Sphereが徐々に膨らんでいき、散らばっていくバルーンアニメーションのシーン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/98f92fe7-b1fd-4681-87cc-570cbe7b46ec.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7da8c0d1-1632-4a0c-849a-2ae29762d156.png)


# 解説


## Vellum Configure Clothノードの基本



Vellum Configure Clothノードは、その名の通り、ジオメトリをクロス（布）として設定するためのSOPノードです。
このノードですが、実はVellum Constraintsノードのプリセットです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c83b1d19-128e-47e8-a07e-8e1f8a7c6abc.png)

Vellum Constraints のConstraint Typeをclothに変更したときと同じ設定を持ち、布専用に事前設定されたコンストレイントを生成します。役割としては、接続されたジオメトリを布として動作させるためのAttributeやコンストレイントを付与してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/10f84bfd-83c9-4329-a3e9-228cfd82a73c.png)

# 基本的な使用方法

1. グリッドなどのジオメトリを用意  少しRotateで斜めにしておく
2. Vellum Configure Clothノード を接続  
3. Vellum Solver に布ジオメトリとコンストレイントをまとめて接続  
4. Vellum SolverのグラウンドPlaneを置き、再生
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/32f0fba5-772f-4cbc-9355-92c442a681bc.png)


すると重力によって布が落下するシミュレーションが確認できます。

![drop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/308906ce-3d29-4ad6-8741-ae84992c2c8d.gif)


### 最適化について

デフォルトのGridのメッシュでは布の変形で変なカドが立ってしまいます。布の変形を滑らかにするには、均一な大きさの三角形メッシュが好ましいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/39ead43c-802d-4058-b670-e07bb40d9c74.png)

そこで **Remeshノード** を使い、ターゲットサイズやイテレーション数を調整してメッシュを三角形化すると、より自然な折りたたみ結果が得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6d853102-e1c0-4680-8146-860f63974dee.png)


### より良い方法：Planar Patch
布状のジオメトリを作るもう一つの方法として **Planar Patch** を使う手があります。最初から三角形のメッシュを生成し、さらに形状を円や長方形などへ柔軟に変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/22acc782-d121-48a0-a2fb-e40d6d66ae86.png)

これに Vellum Configure Cloth を接続し、ソルバーでシミュレーションすると、よりスムーズなクロスが作れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/bbaf3fe8-599e-4357-a2ee-571f7334d406.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/299eb2b1-3169-4f1b-9fb2-f274f8b44718.png)

## 出力の詳細解説

[vellumconstraints　ヘルプ](https://www.sidefx.com/ja/docs/houdini/nodes/sop/vellumconstraints.html)

Vellum Configure Cloth には3つの出力があります。それぞれをNullノードで拾っておくと把握しやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/481b8edf-716a-468c-8a88-3a6f6e2d855a.png)

### 第一の出力：クロス
- 入力ジオメトリに布のAttribute（ドラッグや質量など）が付与された状態で出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/65da9f80-e5cf-4752-bf92-342134b0886a.png)


* dragnormal （ドラッグ法線）: ポイントの抵抗力を法線方向に制御する浮動小数点値。流体やクロスシミュレーションでの動きの抵抗に影響します。風のフォースを適用した時に、サーフェスの法線方向またはカーブの法線方向にポイントの抵抗をスケールします。旗をパタパタさせるは、Normal DragとTangent Dragを別々の値にする必要があります。

* dragtangent （ドラッグ接線）: ポイントの抵抗力を接線方向に制御する浮動小数点値。表面に沿った動きの抵抗を調整します。

* mass （質量）: ポイントの質量を表す浮動小数点値。シミュレーションでの物体の重さや慣性に影響


### 第二の出力：コンストレイント
- 布に対して生成されたコンストレイントデータが出力されます。  
- ストレッチやベンドなどのパラメータが含まれ、これらの剛性や減衰比によって布の動きを制御します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/05824b85-c988-4487-a62b-ab56d341defe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/766f9a62-6f0b-42ff-a5a8-fdf8c660e5ba.png)


* compressstiffness （圧縮剛性　Compression Stiffness）: プリミティブの圧縮に対する抵抗力を制御する浮動小数点値。クロスシミュレーションなどで、つぶれる方向への変形のしにくさを調整します。	初期の自然長よりも短く圧縮した時の拘束の剛性。 非常に剛性の強い低解像度の布は、Bend拘束が原因というよりも、そのトポロジーが原因で曲げることができなくなる可能性があります。 三角形の網目になっていて、その布が完全に硬くなっていれば、それを曲げる方法はほぼありません。 Compression Stiffnessを下げることで、その布をつぶしたり、流動性を取り戻すことができます。 通常では、高解像度の布に対して、この値を上げます。

* constraint_tag （コンストレイントタグ）: ノードで作成されたすべての拘束のconstraint_tagPrimitiveアトリビュートに格納する文字列。 このタグをVellum Constraint Property SOPの Constraint Group パラメータで使用することで、簡単に特定の拘束を変更することができます。

* dampingratio （減衰率）: プリミティブの振動や動きが減衰する割合を制御する浮動小数点値。揺れの収まり方に影響します。Stiffness拘束は、許容できないほどに振動または微震する傾向があります。 Damping Ratioは、この拘束を評価した時にエネルギーを放出することでそれを軽減します。 しかし、Damping(減衰)を大きくしすぎると、満足した拘束にならなくなってしまいます。1未満の値を使用してください。

* restlength （自然長）: プリミティブの自然な長さを表す浮動小数点値。変形時に戻ろうとする基準となる長さを定義します。Distance拘束のRest Length(自然長)は、ポイント間の元々の距離になっています。 このスケールを使用することで、この距離を長くしたり短くすることができます。 0に設定すると、それらのポイントが引っ付くようになります。

* restlengthorig （元の静止長）: プリミティブの初期状態での静止長を保持する浮動小数点値。シミュレーション開始時の基準長さとして使用されます。

* stiffness （剛性）: 拘束の剛性。これは、コンストレイントがパーティクルを初期の静止状態の方に戻そうとする強さを制御します。 初期値を決める際は、10倍で値を変更してみると良いでしょう。

* type （ストレッチタイプ）: Vellum Constraintで設定したストレッチタイプ、例えばDistance Along Edgeが選択されていればdistanceなどの値が入る

**コンストレイント用　２つのPrimitiveグループ**

* bend グループ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/75a197dc-7190-4868-8869-44a27c628466.png)


* stretch グループ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4689f0d8-91bf-4af4-8f56-b40823992dfd.png)


### 第三の出力：コライダー
- 衝突用のジオメトリを接続すると、衝突対象（コライダー）としてまとめて出力されます。以下の図でいうとbox1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5136641b-22cc-4664-9844-c94748f0030f.png)

## パラメータの解説
改めて、Vellum Configure Clothノードで設定できる主なパラメータには、以下のようなものがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/60fbfa69-d2a9-4dbd-812b-d451cec6a56c.png)

- **Mass (質量)**: ジオメトリに適用される重さ  
- **Normal Drag / Tangent Drag**: 空気抵抗のような効果  
- **Stretch / Bend**: 引っ張りや曲げに関する剛性と減衰  
  - **Stretch** は布の伸縮性を、**Bend** は曲げやすさを制御します  
- **Plasticity (塑性変形)**: 曲がった後に元に戻らず形状が変化したままになる設定

剛性や減衰比を調整することで、硬い布や柔らかい布など、さまざまな素材感を再現できます。

### Bend Stiffness

![bend.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9bad1a22-07a3-444d-8326-3c3ac31d2e18.gif)

左：0.0001　右：10000　ゴムっぽい

### Damping Ratio（減衰率）
Damping Ratioをデフォルトの0.01から0.2程度にしておくと、振動が収まりやすくなります。値が大きいほど振動が収まりやすくなります。これにより、布がゴムのように見えなくなります。


### Plasticity　（塑性変形）
Enable Plasticityをオンにすると、衝撃や折り曲げが加わったときに完全には元の形に戻らず、たわんだままになるようなシミュレーションが可能になります。ゴムのようにピンと張るのではなく、紙や金属板が歪んだような表現に使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4c641cfe-c68b-4dc6-8f56-9cd36ad41a4c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a6b68678-e445-427e-b55e-67e85e7c50fd.png)


## Clothとの組み合わせ
Vellum Configure Cloth 以外にも、布の仕組みをベースにしたノードがあります。  



- **Vellum Configure Strut Softbody**: Cloth＋ストラットコンストレイントで、内部構造を持つ柔らかい物体を作成  
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/55b395a6-0158-4cdc-b892-78c5a11b0b02.png)
- **Vellum Balloon**: Cloth＋Pressure（内部圧力）で風船のような挙動を表現  
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/dcfc5f1e-960e-4671-9a4f-7e0d467345cd.png)

### Vellum Configure Strut Softbody
Configure Soft Body は、布（クロス）を内部ストラットで補強したコンストレイントを自動で作成します。球体のような立体メッシュに適用すると、ある程度の形状を保ちながら柔らかい質感を再現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2ceb86fe-b52b-4885-a7e5-f7c89d426bb6.png)

vellumstrutsノードは、布の内部にストラット（棒）を配置して、布の形状を保持するコンストレイントを生成します。これにより、布の内部構造を持つ柔らかい物体を作成できます。

![softball.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e6e8c2de-3bef-40b5-a10e-a498be1d364a.gif)


### Vellum Balloonの紹介
風船効果を狙う場合は Vellum Balloon が便利です。内部に圧力が加わることで、落下後に膨らんだり、つぶれたりするシミュレーションができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/63b9eb22-4367-43a0-9200-3d60e883fd11.png)

![poyo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8425fc03-6516-4a97-9a95-e4bdf1f5ab0f.gif)

#### コンストレイントの詳細操作
Vellum Solver のノード中に入り、 Vellum Constraint PropertiesノードをFORCEに繋いで利用すれば、特定タイプのコンストレイントだけを選択し、静止長（Rest Length）や剛性などを動的に変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/51ee12c0-ca58-4dc1-9336-6db35e4c95ce.png)


たとえばGroupに `@type=pressure` と指定して圧力コンストレイントの値をキーフレームで変化させることで、シミュレーション中に膨らませたりしぼませたりできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/eecc427f-c835-43a5-9329-7ae0fd351d2d.png)

例えば、Vellum Constraint Properties での「Rest Length」を有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a72cb709-7d58-43e7-a861-5ab08e73a6d4.png)

通常時が1、空気がない萎んだ状態が0となります。2を設定すると、元の長さの2倍に膨れ上がります。

各パラメータはキーフレーム可能なので、フレームごとに静止長やストレッチ剛性を変えれば、時間経過とともに膨張・収縮するアニメーションを作れます。つまり、ここに@Timeなどを入れ込めば風船のような挙動を再現できます。

![balloon.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/890effca-d81e-406c-983b-8e05de14819d.gif)

先程は「Rest Length」でしたが、「Rest Length Scale」での操作は乗数となるため、膨らみの操作をするのに特に便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/cf2c2bc4-1dea-448c-b176-e3b396ad129a.png)

## SOPソルバーの詳細説明

シミュレーション中にさらに柔軟な処理をしたい場合は、SOP Solver を使ってコンストレイントジオメトリをフレームごとに加工できます。  
- **SOP Solver (Constraint Geometry)**: コンストレイント自体を操作  
- **SOP Solver**: ジオメトリを操作  

これらを使うことで、より高度なルールによる剛性変化や、Attribute Promoteによる動的変化を実装可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5cee876b-1d98-45d1-9f38-24f6eddf1bd1.png)

# サンプルファイル　実践的な例の紹介

たとえば複数の球体を配置して、それぞれを崩壊させた後に順番に膨らませるようなシミュレーションが作れます。

Wrangleで@restlength = 0.01;で初期状態を設定後、Vellum Drapeノードの第二入力に接続させて初期状態を設定したり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6ce4bfb4-dfb4-4e29-b735-1d933d878874.png)

SOP Solver 内で移動するオブジェクトとの衝突をトリガーに膨張Attributeを転送するなど、工夫次第で多彩な表現が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e012d417-7de0-4819-8297-b4c9c9eb22dc.png)

# まとめ
Vellum Configure Cloth を起点に、Remesh や Planar Patch でメッシュを整えたり、Vellum Constraint Properties や SOP Solver で動的にパラメータを変更することで、さまざまな布の質感・挙動をシミュレーションできます。風船、柔らかい物体、塑性変形など、使いこなせるようになればHoudiniでの布表現の幅が大きく広がります。