Cloud Shape Generate [Mardini2024]

これはMardini2024のDay14 Cloud Shape Generateの動画を視聴してまとめたものです。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1595c5fd-4c3a-4bc0-0cad-403b1e8ee31e.png)

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

[Day13 RBD Material Fracture](https://qiita.com/jyouryuusui/items/3496544b4454b785739e)　|　Day14 Cloud Shape Generate | [Day15 Pyro Burst Source](https://qiita.com/jyouryuusui/items/822b27981e7a13d82317)

Cloud Shape Generateノードを使用すると、積雲の形状を生成することができます。また、クラウド以外の形状生成にも応用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d372f424-5e08-183a-f11b-964c046a70f9.png)


# 要約

- Cloud Shape Generateノードは、積雲の形状を生成するために使用される
- クラウドの種類(Mediocris, Humulus, Congestus)を選択できる
- 形状のオフセット、ポイント間隔、サイズ、歪みなどを調整できる
- Secondary Shapesを追加して、クラウドのディティールを増やすことができる
- 入力ポイントを使用して、複数のクラウドを一度に生成できる
- Attributeを使用して、クラウドのパラメータをランダム化できる
- Cloud Replicateノードを使用して、クラウドのディティールを追加できる
- VDB from Particlesノードを使用して、ポイントクラウドをボリュームに変換できる
- Billowy Noiseノードを使用して、クラウドのディテールを追加できる
- クラウド以外の形状生成にも応用できる(Bubble Remesh, Copy to Pointsなど)

# サンプルファイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6a48d875-293b-b087-7f36-2db1e47723e1.png)

CLOUD　：　Cloud Shape Generate を利用した積雲の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/748ca66c-2dfd-730a-1e1e-a33cc7e85c1d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6b315823-69fe-fd8f-d138-e44ddb545382.png)

CLOUD_SHAPE　：　Cloud Shape Generateノードでユニークな形状を作成する例



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/47ebd0b4-c132-dc39-1b84-8b56c46b1e24.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/35bc43fd-8112-0d46-cab7-990cdaeeb380.png)


Stage

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6cdc97ff-365e-8526-a029-6fc7070b5283.png)


## Cloud Shape Generateノードの基本設定


このノードはSOPレベルのジオメトリノードなので、まずジオメトリ内にCloud Shape Generateノードを作ってみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1760efd8-1c88-3732-b472-615f4b8821ef.png)


ノードには入力が1つありますが、デフォルトでは入力を必要としません。
ノードを作成すると球体（として表示された点）の集合が作成されます。これによってこれから作成しようとしている雲の形状の大まかな推定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a48c9970-a294-1126-0677-9d16331539d9.png)

ではこれから積雲を作成していきます。注意点として、これはふわふわした積雲などを作成するためのもので、層積雲や巻雲を作るためのものではありません。

- Cloud Speciesでは、雲の種類（平らな雲や背の高い雲などのプリセット）を選択可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1f77d6e9-a971-21cc-02a5-34cb3d0fc096.png)

Mediocris：平らな雲と背の高い雲の中間　（デフォルト）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2f462504-8cdf-958c-991d-174970eba184.png)

Humulus：平らな雲

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c6a1b25b-df26-a31d-bc09-25b51f39e950.png)

Congestus：高く積み重なった雲

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/32b1728c-00f1-8790-89c5-759f133c4932.png)

この先はmediocrisで作業を進めます。

### Shapeの基本設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9207efc6-5ebc-4406-fc50-6727e0fcf3ba.png)

■ Shape Offset:雲の形状変更

形状を変更するにはCloud Shapeタブ内のShape Offsetを利用します。シードに応じて色々な形の雲が生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/33787cb8-4579-db9f-b6f2-1f8059c53ed1.png)


■ Point Separation:ポイントのサイズ調整

Point Separationでは、雲を生成するときのポイントのサイズを定義するものです。サイズを小さくすると、雲とポイントが小さくなります。デフォルトでは0.1ですが、これを0.05に変更すると図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6beb6463-d651-aa1c-6589-cfd34d52c55f.png)

■ Initial Size　, Length , Width

Initial Sizeは、多くの場合、増加させる必要があります。なぜなら、一般的にこのような小さなスケールで雲を扱うことはないからです。10以上に押し上げることもあるでしょう。Lengthは雲の長さ、Widthは雲の幅です。図はLengthを10、Widthを10に設定したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f31b1a35-dc4d-72cf-ace1-27e56c6032cc.png)

■ Distortion　, Flat Bottom　, Up Vector , Rotation

Distortionは雲を何らかの方法で歪ませるノイズパターンです。例えばShape Offsetがあんまり良い形状にならず、歪みを加えたい場合などに便利です。

Flat BottomはHeightで定義されます。これを上げると底が一緒に上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c3fe0cde-da2b-e34e-702c-db7023679fb6.png)

Up Vectorは、雲の上向きの方向を定義します。Y方向以外の向きや負の方向も可能です。Rotationでは回転も可。

以上が基本的な設定です。

### Random Scale per ShapeとSecondary Shapes

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/346604b6-6174-4710-3c0c-cc2880ffc22b.png)

Secondary Shapesを無効にして、基本的な基礎となる形状がどのようなものかを見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ef944a58-52a5-cca6-2755-7c4c5ddb922b.png)

上からの視点で見るとわかりますが、雲のポイントはPoint SeparationにRandom Scale per Shapeを乗算したサイズになっていることがわかります。デフォルトの状態において球体の一つ一つは、Point Separationの1～2倍の範囲でスケールが設定されています。Max Scaleを1にすると、均一のサイズにスケーリングされます。逆に3に増やすと、さらに大きな範囲になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/23c36628-0175-cd12-e98a-3a46e2f70d5c.png)

次はSecondary Shapesを見ていきます。
先程の図からもわかるように、無効にすると単一の平らな層になり、有効にすると既存の形状の上に層が追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1a7af2cb-b6f6-342e-25dc-862b73f69ac0.png)

Iterationsは、どの程度層を積み重ねるかのレベルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/631751d8-1976-b799-6e72-b884f811f1f0.png)

Displacementは、各Iterationsでどれだけ上に移動するかを設定できます。1以上にすることもできますが、1の値でも基本的には大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7b422b28-b37d-9239-9e30-816b070d7141.png)

SpreadはY軸以外の別の方向に広げることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e3b3d220-799b-511a-3ede-83db99d43223.png)

また、Secondary ShapesにもRandom Scale per Shapeがあります。設定方法は先程と同じです。

### Outputタブの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/61334928-a48b-102e-caf1-8ae6eb98c870.png)

Fuse Distanceは名前の通り2つのポイントが1つの球体にFuseする最小距離です。この値を大きくすると球体の数が減少します。重なりが減ることで雲に隙間ができやすくなります。その隙間が面白い形を生み出すかもしれません。

Remove Below Scaleは単なるしきい値で、ポイントのpscaleがこの値より小さい場合削除されます。

### 複数のクラウド生成

Grid上にScatterでポイントを散らばらせた（Force Total Count:10）ジオメトリを作成し、Cloud Shape Generateノードの入力に接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/bc4c52ef-58c0-6054-1173-172578a2acf5.png)

先程の設定ではCloud Shape GenerateのShapeにあるInitial Sizeが10になっているので、1に戻しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9d8a8cb7-c1b8-bb2b-677a-7bf968841dd7.png)

これでスキャッターした10のポイントに対応した10個の雲を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/cc8e82f4-f418-b22a-82c9-00cceb217d8b.png)

これらの雲の一つ一つには、Cloud IDが設定されています。（Point Attributesに0から9まで割り当てされています）
ColorノードをCloud Shape Generateの後ろに追加してRandom from AttributeでCloud IDを指定します。そうすることで、球体の各セットが異なる色を指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/02df7e72-4ffd-995a-135e-2ca0964038f6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/99950358-59d0-e879-5553-366ec79b81cb.png)

この区分は利便性が高そうです。例えば、For Eachループを使って、形状のそれぞれに個別に操作を実行できるからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/efcf90c3-d8ce-bec1-7578-a3b142989e17.png)

For Each Named Primitiveを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3d1bf8fc-149d-6e56-3f82-26689951181f.png)

Block Beginで設定するPiece Attributeを"cloudid"に変更し、Piece ElementsをPointsにします。これで、それぞれの雲を個別に取り出すことができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/91beacce-22ee-e0ac-3a9e-98e7e0d69efa.png)

### ランダム化とディティールの追加

For-Eachを利用しなくても複数の雲ごとに操作を実行する方法もあります。わかりやすい例としてRotationのパラメータを見てみましょう。通常ここのパラメータを変化させると全てのグループの雲が一様に回転し同じ方向に向いてしまいます。そこでSet UniformをSet Varyingに変更します。こうすることで、それぞれの雲に対して回転のバリエーションを持たせることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9d36b3e5-785f-ab20-4f0e-d219056ad208.png)

この変動は、Variationパラメータが利用されます。25がセットされていれば最小と最大として‐25　〜　+25で、実際には50の範囲になります。これを180に設定すると、360の範囲でのランダムな回転になります。

他にもランダム化をより細かく制御する方法があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/181aaf94-c193-6167-2e8d-f330c8a0c4c4.png)

サイコロアイコンをクリックすると、Attribute Adjust Floatノード（ノード名はクリックした項目に応じて変化します）が自動で追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/768a760f-b13b-9a42-7bba-254013f5680f.png)

このノードでは各ポイントに回転値を与え、rotationというAttributeに格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7bfa6a18-4207-981c-e8ff-a95fefc1dd7c.png)

この手法の最高なところは途中の処理でAttribute Wrangleが使用できるところです！

例えば雲の情報は全てAttributeで管理されているので、

```c
@cloudspecies=2;
```

と記述するだけで、Congestusタイプの雲（背の高い雲）に変更することができます。
グループと組み合わせると、ここは積雲に、ここは背の高い雲に、といった具合に自由自在に雲の形を操作することができます。

### Cloud Shape Generate + Cloud Shape Replicate

Cloud Replicateノードを追加して、クラウドのディティールを増やします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/dbfa7424-1d13-dac3-a697-bb6ada0f547e.png)

接続すると元の雲の形状を踏まえた上でさらに細かいディティールが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ea545d13-75dd-443a-0616-f8bb70e451a3.png)

### Cloud Shape Generate + VDB From Particles

これまで作ってきた雲は、言ってみればただのpscaleを持つポイントです。これをボリュームに変換してあげます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2d496b86-9d3b-5db6-e45e-9895da199e91.png)

VDB From Particleノードを接続し、Voxol Sizeを上げて、Fog VDBを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9c273dc6-3627-ba05-84d4-f39e06644877.png)

Fogに変換できたので、Density情報としてCloud関連の他のツールをすべて使用できるようになります。今回はBillowy Noiseを接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/182447c4-e0f9-697d-512b-0ca40082f402.png)

Lookをオーバーライドしてノイズの状態を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2080bc6c-9340-2d80-dc6d-1db69d898f62.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/eb3d430e-20a8-360d-d784-8e9e0c47b7e2.png)

ノイズの解像度が低いので、AmplitubdeやElement Sizeを変更して細かいディティールを出します。
Iterationsを有効にすると、ノイズを複数回繰り返すことができます。Attenuation Settingsを使用すると、ノイズの強度を調整できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/934c1813-378c-7be2-74b0-8410f3561110.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4d605f0f-b34a-ad1f-a4fd-af0da534535b.png)


サンプルファイルのCLOUDでは、より詳細な設定が行われています。ランダム化、平坦化、VDBへの変換、Densityの調整、Billowy Noiseの追加、クリップ、いくつかのポストプロセッシング、そしてボリュームの調整など。
レンダリングについてはKarma Cloudマテリアルを使用します。
※動画では30秒で終わっているので、詳しくはhipファイルを見てください。




## Cloud Shape Generateノードの他の用途

- このノードは雲以外の形状作成にも利用できます
- Bubble RemeshやCopy to Pointsを適用することで、ユニークな形状を生成可能です

### Bubble Remesh

Bubble Remeshを使用して、ポイントクラウドをリメッシュすることができます。そのままだと縮んでしまうので、pscaleをWrangleなどで2倍にします。

```c
@pscale=@pscale*2;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5bc727f6-df83-fda1-6d26-1adb7620e5f4.png)

### Copy to Points

Copy to Pointsで2番目の入力にTorusを使用した例

Attribute Randomizeノードを使用して、コピーしたジオメトリのオリエンテーションをランダム化しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e214b01c-0748-6b1c-4f7b-fa1edac938ce.png)


# まとめ

Cloud Shape Generateノードを使ってリアルな積雲の形状を生成したり、クリエイティブな形状を作成したりできます。パラメータを調整し、他のノードと組み合わせることで、様々な表現が可能です。