Vellum Configure Grains [Mardini2024]

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ca039247-9434-e608-4dfc-d07bc8e571c6.png)

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

[Day11 Vellum Brush](https://qiita.com/jyouryuusui/items/4c7928ada302e1acc98a) | Day12 Vellum Configure Grains | [Day13 RBD Material Fracture](https://qiita.com/jyouryuusui/items/3496544b4454b785739e)

Vellum Configure Grainノードは、Vellumグレインとフルイドのシミュレーションを設定できます。また、剛体シミュレーションにも応用できます。

# 要約

- Vellum Configure Grainノードは、Vellumグレインとフルイドのシミュレーションを設定するために使用される
- ジオメトリからポイントを作成するか、既存のポイントを使用できる
- パーティクルサイズ、パッキング密度、物理属性を調整できる
- 摩擦、引力、反発力は、Vellumソルバーノードで設定する必要がある
- フルイドシミュレーションでは、粘度、表面張力、フェーズを調整できる
- フェーズを使用して、複数のフルイドを区別できる
- Vellum Configure Grain Piecesノードを使用して、ジオメトリを剛体シミュレーションに変換できる


# サンプルファイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3fe4699b-00f6-6dbc-0b5a-aabcab1f5ce0.png)

GRAINS_BASIC

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/34757ff4-42b0-af90-d42c-165fa424fe72.png)

FLUID

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4268cc00-91d1-ca8a-f300-d089a9d4736a.png)

COPIES

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e057520d-6333-6cf6-6463-684b032c6943.png)

## Vellum Configure Grain SOPの基本
- Vellum Configure Grain SOPは、Vellum Grainsのセットアップに使用されるノードです
- Houdiniのシェルフ（シェルフにGrainのグループがありますが、そっちではなくVellumの方にあります！）からVellum Grainsを選択すると、AutoDopNetworkとGrains Vellumノードが作成されます。実際のシミュレーションはDOP Network内で行われます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/716c2ada-548f-cd10-38ac-54f95fcf614d.png)
    - シェルフ選択後、例えばSphereを選択する
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8cb440ea-d94e-4fc9-bdc4-c9998ff54776.png)
    - AutoDopNetwork内
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ec307faf-7324-7d7a-b2be-aa6cde7c7026.png)
    - このままでは地面がないので、GroundPlaneを追加します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/edeceefb-812e-db87-dc77-ce8f052f0f9d.png)
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1ea063a1-59e0-764c-1d40-84f5a0828c09.png)

- 再生させてみると、崩れていくことが確認できます

    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/92158588-0550-345b-247f-5b893825395b.png)
    - このシミュレーションはDOPNet内のvellumsolverが制御しています。サブステップがすでに5に設定されていますが、これはグレインやフルイドを扱う際に推奨される値です
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/394b9323-57ad-8510-3183-52fb4621cc4c.png)





## ポイントの作成方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9e00c052-5656-6e3e-aa61-8de80d7f01e5.png)


- 先程のシェルフのVellum Grains作成時に、AutoDopnetwork以外にも元のSphereジオメトリ直下にVellum Configure Grainsが追加されています。まず注目すべきは、このCreate Points from Volumeです
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c5389da1-f91a-5618-681e-c344b1ece186.png)

- vellumconstraints_grainノード作成時Create Points from Volumeは無効なのがデフォルトの状態です。無効状態の場合ポイントを取り込むことを期待しています。Create Points from Volumeを有効にすると、スフィアがポイントに変換されます
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/48fe840b-96e5-95cb-f095-f90718098bf3.png)

- ポイントの作成方法は、Regular Grid（規則的なグリッド）またはSphere Packing（球体のパッキング）から選択できます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/575e3b22-157f-a955-0d24-eabeea02c81e.png)
- Particle Sizeパラメータは、パーティクルのサイズを制御します。Particle Sizeをデフォルトの0.1から0.05に小さくすると、パーティクル数が増えます。0.03ではさらに増えます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b9c3ed36-a13e-3a3e-e6b9-1989f16ddea9.png)


- Packing Densityパラメータは、パーティクルの過剰パッキングに使用されます。グレインの場合は使用されませんが、流体の場合は増加させる必要があります。グレインでPacking Densityを上げると、最初に実行したときに重なったコライダーができてしまい、爆発してしまいます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1dc0c82a-8d9f-e7ef-de19-645d5e3186a9.png)



## Physical Attributesと乗数（マルチプライヤ）
- Physical Attributesを見ると、Phase（フェーズ）、Viscosity（粘度）、Surface Tension（表面張力）などがグレーアウトしているのがわかります。これについては後ほど説明します。そのほかにFriction(摩擦)、Dynamic Friction（動摩擦）、Attraction Weight（吸引力）、Repulsion Weight（反発力）があります
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1e1c014f-6f03-5a0f-77be-89e176331969.png)

- ここで、ポイントを引き付け合ってまとまるようにしたいとします。そのためにはAttraction Weightを使用します。これを100のような極端に高い値に設定してみましょう。その状態でアニメーションさせてみると、パーティクルが全て引き付け合います！‥と思いきやまったく効果がありません
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/aa42af17-89b3-75c3-ef3e-fb71fb9afcbe.png)
- よく見てみると、これらのオプションは乗数になっています。Vellum SolverのAttraction Weightパラメータに対するマルチプライヤーとして機能すると書かれています。では、これを1に戻して無効にし、Vellum Solverに移動します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1ff700df-2bb0-112e-0af5-0718af5191c3.png)

- Vellum Solverの Advanced タブに移動し、Grain Collisionsの下にAttraction Weightがあります。これを0.3のような値に設定して再生すると、粒子が引き寄せられているのがわかります
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/dc8b4f8e-33de-13a9-89d4-6c82acbccdf4.png)
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c4b53fe5-c930-bd2a-a7d0-4b5b1126459a.png)

- Vellum Configure GrainsのAttraction Weight Multiplierを使えば、Attraction Weightを変更できます。これを2に上げると、さらに高い値になります。0.3の2倍なので、0.6になります。Repulsion Weight、Friction、Dynamic Frictionも同じです。先ほど100の値を入れても効果がなかったのは 0 x 100 = 0 だったためです
    - Vellum Configure GrainsのAttraction Weight Multiplier:2　Vellum Solver　Attraction Weight:0.3　の場合の動作
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/322509df-e9dc-42c1-06f1-1726f96059f0.png)
    - Vellum Configure GrainsのAttraction Weight Multiplier:4　Vellum Solver　Attraction Weight:0.3　の場合の動作
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/87069c72-60e0-05e1-c985-655a84cb57f0.png)




## SOPレベルでのグレインのセットアップ

- では、Phase、Viscosity、Surface Tensionはどうでしょうか。これらはVellum Fluidsのためのものです。先ほど作成したノードを削除して新しく作っていきす
    - これを消す　
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f6da3c7c-a6ff-56a3-ad2d-4104e569ed96.png)
- フルイドを見る前に、SOPレベルで通常のグレインSOPを構築する方法を見てみましょう。新規のジオメトリ作成
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a6afbf0c-d0e3-e30e-0889-90058cfbffcf.png)
- Sphereを追加し、Vellum Configure Grainsを使用します…しかし、接続しても何も起きません。なぜならCreate Points from Volumeを使用する必要があるからです
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/86054a09-86c6-2f88-2ce6-bb1ed8348a63.png)

- もう一つの方法は、Grain Sourceを使うことです。このノードはVellum Constraintsにインフォームを送るので、一緒に使うと便利です。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0160ba3c-f5a4-6e85-0e6d-f7d6e92de2f5.png)
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e74a3670-a2c0-80db-2929-1528621c65d5.png)

- Point Separationを0.05程度に減らしても、パーティクルの実際のスケールは変わりません。これは、Particle Sizeを手動で設定しているからです。これを無効にすれば、Grain Sourceから取得されます。ここで値を下げると、それに合わせて変化します。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/458c09fa-3529-ccd1-4505-61026604e906.png)
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2a6b4e26-cef2-b22a-255a-e93f1b11ec15.png)

- あとはVellum Solverに入れるだけです。この3つを取り、GroundPlaneをY=-1に追加し、サブステップを5に上げ、少しAttraction Weightを追加すれば、グレインができあがります
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ae3eb07d-d28f-e361-7be9-b443ce110cae.png)
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1e9df622-2b99-0505-559e-fe923ae94e21.png)
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8ac2ada7-cd59-2603-7bcf-807b17e8b3a5.png)


## 流体のセットアップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f761e120-6dc8-1e8d-6e20-4bcb43271edd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d2ed2bf1-1164-89df-792b-b2b0320c78b0.png)

- 次はVellum Fluidで試してみましょう。このノードを取得する方法は、Vellum Configure Grainsの代わりにVellum Configure Fluidを使うことです
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c3f08a29-3694-3404-8ecd-d9fab7942c48.png)

- Vellum Configure Fluidを配置すると、実際にはVellum Configure Grainsノードになっています。TypeがGrainからFluidに変更されただけです
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1b420557-3039-ef67-c882-1c3659320a2a.png)
    - これにより、粘度、表面張力、摩擦などの他の物理属性にアクセスできます。配置すると、Packing Densityが1より大きい値に増加するのがわかります
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/413fae52-ab38-f736-6558-8f423cd2dd0a.png)

- Sphereを作成し、Vellum Fluidに接続し、コライダーを接続します
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e31da695-d96b-ee51-afe2-c162cfb09c90.png)


### フェーズ

パーティクルのGroupがFluid AとFluid Bに分割されています。図で選択されているのがfluid_A
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/26411873-4646-1f40-1490-e1e6adde8bf9.png)

Fluid Aは白で、質量が低くなっています。これにより、白いパーティクルが上に来ます。他のパーティクルの半分の質量しかありません。また、粘度が少し高いので、速度を共有します。表面張力もあります。フェーズを1に設定しています。フェーズは、これらが2つの異なるフルイドであることをソルバに伝える方法です。2つの異なるフェーズ値があれば、2つの異なるフルイドです。フェーズの実際の値はあまり重要ではなく異なっていれば十分です。同じフェーズ値を持っていれば、互いにブレンドします。フェーズ1とフェーズ2があれば、より2つの独立したフルイドとして扱われます。
Vellum Solverで再生すると、白いパーティクルが上に上がり、青いパーティクルが下に沈んでいくのがわかります。白いパーティクルは粘度が高いので、泡のように動きます。これは非常に安価にフルイドを作る方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/afb4b4f6-428b-ca79-140c-8edfba21126d.png)

ここで使用されているのは、粘度、表面張力、フェーズの3つの値です。粘度は、パーティクルが近くのパーティクルと速度をどの程度共有するかと考えることができます。表面張力は、フルイドがどの程度まとまろうとするかです

```c:Fluid A（白）泡のような動作
v@Cd = set(1,1,1);//白
@mass *= 0.5;//水の半分の重さ、軽いので上に来る
@viscosity = 2;//粘度が高い
@surfacetension = 1;//表面張力が高い
@phase = 1;//フェーズ1
```

```c:Fluid B（水色）水のような動作
v@Cd = set(0.4,0.7,1);//水色
@mass *= 1;//重さ1
@viscosity = 0.7;//粘度が泡より低い
@surfacetension = 0.2;//表面張力が低い
@phase = 2;//フェーズ2
```

### まとめ

- Vellum Configure Grain SOPは、TypeをFluidに設定することで、流体のセットアップにも使用できます
- Viscosity、Surface Tension、Phaseなどのパラメータを使用して、流体の動作を制御できます
- Phaseパラメータを使用して、異なる流体グループを定義できます。同じPhase値を持つパーティクルは混ざり合い、異なる値を持つパーティクルは別々の流体として扱われます


## Vellum Configure Grain Pieces SOPの使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/86ad874b-784e-d2a1-38c3-bf469e913f2f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4bfcb7cd-62c7-6e3d-6d02-f2195660b4b7.png)


ラバートイを用意し、グリッドをたくさん作り、ランダム化されたOrientアトリビュートを各ポイントに追加し、それらをポイントにコピーしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5c21afcc-6c39-4850-58b5-d7061b5cf1fe.png)

その際、Pack and Instanceを必ず行います。各ジオメトリを1つのジオメトリとして扱いたいからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a96e612f-990a-846b-8a9f-edeb35d2745a.png)


Vellum Configure Grain Piecesを使用すると、Vellum Grainsと Shape Matchを使用されます。これを最初の入力に接続すると、計算に少し時間がかかりますが、グレインを使ってジオメトリの推定をしているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/bdce9d07-c6d1-2838-dbb1-1900beec520e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/dbeaa86f-cd95-cbd6-45e3-0b86994a865a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5619bca1-19fd-ed9c-090f-756f7bfe02b1.png)

Sphere Packingは、ジオメトリの形状を可能な限り正確に推定するために、たくさんの球をジオメトリにパックしようとしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f33fc6b5-a64a-6391-7e4f-d77301de778a.png)

Particle Sizeを0.07程度に減らすことで精度が上がります。ただし、デフォルトではMax Spheresが100上限の設定制限があるため無効にしておきます。

この仕組みは、実際に各ピースの接続性を取得し、ピースアトリビュートを追加します。ジオメトリスプレッドシートに行くと、このピースアトリビュートを見ることができます。ピース0からピース599まであります。各ポイントは異なるピースに属することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/21737000-2818-9a4d-e80f-fecf2ea61502.png)


次に接続されているVellum Shape Matchは、同じピース番号を共有するポイントを接続します。これらのコンストレイントのすべてが、これらのポイントを一緒に保つようにしていることがわかります。アニメーション時に1つのピースとして動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/dcd84381-af01-3e01-98c3-d7363e7fc822.png)


つまり、Vellum Solverを使えば、簡単に剛体のような振る舞いを再現できます。
しかし、ここまではただのグレインのポイントで、ジオメトリには反映できていません。ここで使うのがTransform Vellum Piecesです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/05cee630-1b89-e470-1aec-b27d5037011c.png)

このノードは、最初の入力としてVellumジオメトリを取り、2番目の入力としてVellumコンストレイントを取り、最後の入力としてピース、つまり最初のジオメトリを取ります。そして、このVellumシミュレーションに基づいてそれらのピースのジオメトリを変形します。
これは剛体シミュレーションを行う方法です

### まとめ

- Vellum Configure Grain Pieces SOPは、複雑なジオメトリを剛体としてシミュレートするために使用されます
- このノードは、入力ジオメトリを分析し、グレインを使用してジオメトリの形状を推定します
- Particle SizeとMax Spheresパラメータを調整して、推定の精度を制御できます
- Vellum Shape Match SOPを使用して、同じピース番号を持つポイントを接続し、ジオメトリが1つのまとまりとして動作するようにします
- Transform Vellum Pieces SOPを使用して、Vellumシミュレーションに基づいてピースジオメトリを変形させ、剛体シミュレーションを実現します