Flip Solver [Mardini2024]

これはMardini2024のDay17 Flip Solverの動画を視聴してまとめたものです。

[動画](https://www.youtube.com/watch?v=yeZ6i3pLAHc&t=70s)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a1869ecd-aff4-02ed-2f40-db7c8103c1d6.png)


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

[Day16 Ocean Spectrum](https://qiita.com/jyouryuusui/items/a2a823aaf5b07c8011ef) |　Day17 Flip Solver |　[Day18 APEX Scene Animate](https://qiita.com/jyouryuusui/items/25bfe0cf11c9625ae5a2)

Flip Solverノードは、流体シミュレーションを行うことができます

[Flip Solverのヘルプ](https://www.sidefx.com/ja/docs/houdini/nodes/dop/flipsolver.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f489f4f8-2301-906e-ef61-468955d0199b.png)


# 要約

- Flip Solverノードは、SOPレベルのノードで流体シミュレーションを行います
- Flip Containerノードで、シミュレーションの基本的なDomain(境界)と初期設定を行います
- Flip Collideノードを使ってコライダーを追加できます
- Flip Boundaryノードを使ってソースやシンクを設定できます
- Viscosity（粘度）やDensity（密度）などのAttributeを追加し、流体の振る舞いを制御できます
- Fluid Compressノードで出力データのサイズを削減し、ディスクに保存できます
- Flip Solverノードの中に入るとフォースの追加や高度な設定が行えます
- SideFXのプリセット（Flip Configure）として溶岩やタンク、海洋レイヤーなど、様々なプリセットが用意されています

# サンプルファイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f111dbd8-f99e-994f-c584-970c41ded9df.png)

FLIP SPLVERノード内に２つのネットワークが構築されています。


Viscosity（粘度）サンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/99b28dca-e99b-4242-099b-225428773cb8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8be9247f-deeb-4241-7a39-ee24d727fd6e.png)




Waterline（水面）貯水サンプル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c0df7b24-8ca5-200f-3fac-b36332dd8efa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/77f34df2-56ab-86ae-a93f-2fb9f78b6cb3.png)




# ダイナミクスとFlip Solver 

御存知の通りHoudiniには、ダイナミクスのコンテキスト(DOP)があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d0dcc40f-0fa6-e35c-7d1d-6ec063af9437.png)

最近、SideFXは、ダイナミクスソルバーへのアクセスを提供するSOPレベルのノードを作成しています。そのうちの1つがFlip Solverノードです。

Flip Solverを作成し、中に入るとダイナミクスネットワークを含んでいることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f3beee11-80f7-7b5b-c26a-6d31017bdbc8.png)

SOPレベルで作業でき、多くのツールを使用できます。

## Flip Solver + Flip Container

Flip Containerノードは、Flip Solverの基本的な境界を設定するものです。
Flip Solverに入力する３つのソースを、このノードが提供します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5a418831-9071-4a9d-a10b-86b21a3111a4.png)

接続するとエラーは解消されます。しかしキャッシュのための青いバーの表示はされますが、実際にはまだ何も起こっていない状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c728f36d-9fe0-6e4c-bc3a-5d3c14a93778.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7fdbae92-49e4-52d5-1430-59158decd9c0.png)

このFlip Containerは、粒子分離やドメインなどを設定します。シミュレーションを行う際、ドメインの外に出るものはすべてシミュレーションから除外されます。
また、密度、表面張力、粘度、その他のAttributeの設定も含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/82fba45a-7478-3f03-9ec0-ff15de92b5fa.png)

Flip Solverを見てみると、Particle Separationはグレーアウトしています。これは上流のFlip ContainerからParticle Separationを取得するためです。チェックボックスを有効にすることで、明示的に指定することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/44ff559b-15fc-9a2b-83a7-6031e89bf41e.png)

WaterlineタブからWaterlineを有効にすると水面を追加することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/aab560cc-39c9-0265-4472-eb01ace2c3f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/777f8436-9143-19b0-caee-fe345e6060f9.png)


水面はFlip Containerのサイズに依存します。たとえばDomainのサイズを半分にすると、表示される領域が狭くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6cca6594-82d2-7168-158f-29c01ea26b7b.png)

## Flip Solver + Flip Collide コライダーの追加

Flip Collideを利用してコライダーを追加していきます。このノードの便利なところは、先程のノード間に差し込んで、使用したいコライダーを選択するだけよいというところです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/585956a2-f4c3-b181-2783-37681c22e40c.png)

ラバートイをトランスフォームで斜め上に動くキーフレームのアニメーションを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/6c814497-84f1-7c66-dcfc-c99a2fa87e9b.png)

Flip Collideは入力に基づいてボリュームを生成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/03c9942c-ef27-da03-ec6a-6495b80253e7.png)

そしてFlip Solverに入力するとコライダーとなり水面とのFlip衝突が簡単にできるようになります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/eeaac88a-e772-d446-7b8a-2a23491b0238.png)


## Flip Solver + Flip Boundary ソースとシンクの追加

もしも水面がない場所（flipsolverで先程チェックしたWaterlineを無効にしてください）で水源を調達したい場合は、Flip Solverの4番目の入力がBoundary Flowを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e7dac0c1-cf9c-7ef0-66c1-dabc8d0b2974.png)

使い方はジオメトリを接続するだけです。ここではSphereを接続しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/61cd7317-5da3-0fd2-316e-574587adbd57.png)

シミュレーションを開始すると、落下する水球ができます。しかし、まるごと落下してしまうのはシミュレーション用のソースとしては微妙です。そこでFlip Boundaryノードを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/38e7a990-80b7-76ea-1c88-4750c974ac30.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/76a57ad6-c40c-63b0-42e6-a2a0ae47fdf0.png)

継続的に水が流れ続けます。
これがFlip Boundaryのtypeのひとつです。

そしてもうひとつのtypeがシンク機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/67d0e8df-e393-ab6e-4495-d07051ba5981.png)

まず、Flip SolverのCollisionタブでGroundPlaneを有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/41683849-c863-2180-50f3-635cef9ed7ad.png)

展開すると、GroundPlaneの高さを変更できるので少し下げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f29cfa84-7649-3314-f92b-c15ec2640a93.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8bda638a-ebf1-8901-397c-71594c541340.png)

次に追加でTypeをSinkにしたFlip Boundaryノードを差し込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/56623267-11f8-af03-2ca0-77a0d78af273.png)


今度はPoly Extrudeを適用したTubeを入力します。するとこのTubeに触れたエリアから水がシンクに流れるようにシミュレーションから削除されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d1853213-62af-8e2e-6a1c-8cfaa5183149.png)

## その他の設定とビジュアライゼーション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7a73adcf-ab84-e189-9f44-b8fa36577680.png)

通常のDOP上でアクセスできる設定が他にもまだあります。

- Air Incompressibility(エアの非圧縮性)は、水タンクのような例で上昇する気泡を作成するのに役立ちます
- Enforce Particle Separationは、パーティクルが自分自身で崩壊していて、流体の体積が失われている場合に便利です
- Detect Droplets(ドロップレットの検出)は、主粒子の塊から離れて移動している粒子を検出するのに便利です
- Velocity Transferのタイプを変えて飛沫を上げたり、渦を巻いたりできます
- Visualizationタブ内ではポイントを球体とするかのチェックボックスや色の設定があります
- Advancedタブでは、パーティクルナローバンドのチェックボックスがあります。これは、先ほどのWaterlineを使用している場合に便利です。表面下のすべてのパーティクルを実際にはシミュレートしないように、ナローバンドを持ちたい場合などで有効です

## Attributeの追加

・特定のソース（この例ではSphere）にAttributeを追加する場合

SphereのTypeをPolygon、Frequencyを50、Scaleを２倍にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/1901094d-97ea-045d-9b4d-367816dc9d65.png)


ここから粘度を追加していきます。

Attribute Noiseノードを使用してviscosity(粘度)を設定します。型はFloatです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/945b972e-05ff-feba-1698-2047df25ab28.png)

リマップ範囲を有効にして、振幅を1000程度、Post-ProcessのMinimumを0.1に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5b258548-6b33-ee43-5cd6-904382505e7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b8fd774d-8da1-459a-d6f8-92f44b310b91.png)

まだこの状態では粘度は反映されていません。そこでFlip Containerノードの粘度を有効にして、Varying Viscosityも有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0c27bb4e-6fed-d05b-dfed-35856bd7f70b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/162073ae-7c8f-0f20-65a8-323e505cb94f.png)


Densityを設定する場合も同様の手順で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/605a571d-385f-3587-b772-6ee17791e39c.png)

流体シミュレーションでDensityが設定されていると低密度のパーティクルが上部に上昇し、重いパーティクルが下部に沈みます。

## Flip Solver + Fluid Compress シミュレーションの設定と出力

シミュレーションを出力する場合は、Fluid Compressを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4b56138c-b825-bd58-cdc1-ff128ad2fa69.png)

このノードはディスク上で占めるサイズを削減します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/747ca873-8ffa-c904-990b-df50731c5465.png)

## Flip Solver + Particle Fluid Surface シミュレーションの設定と出力

さきほど出力したファイルキャッシュが出力されたら、Fluid Surface Particle Fluid Surfaceを使用します。

再び、3つの入力を接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/57e3fc3c-ad30-8819-6dfc-58ab2f14c71f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d904942a-8fa5-de09-06d9-4bc1b00d4082.png)

ここではFlip SolverからParticle Separationを取得します。つまり一番上流にあるFlip ContainerのParticle Separationを変更するだけで、ここの解像度も変更されます。
このようにシミュレーションデータの多くは、他のノードから取得される情報を利用していることがあります。


## 高度な使用法とプリセット

Flip Solverノードをダブルクリックして中に入ると、フォースにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d80c5860-5d18-22b8-da52-5000f75337dd.png)


たとえば、Pop Windなどを使用できます。
Amplitudeを上げると風の影響を与えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0e98ff2a-864d-afff-dc04-b740dca39419.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a06240fd-d579-8561-b9fa-1c90b749b43f.png)


より高度なユーザーの場合は、ノードのロックを解除してDOPを自由にカスタマイズすることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0266b63b-46c1-931d-b4b2-f0ddc8b22825.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/4fe18524-0dfc-cdce-c3b0-00166a9e3dd0.png)


またSideFXはいくつかのプリセットを用意してくれています。

Tabを押してFlip Configureと入力するといくつかの候補が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2188dce4-0ce8-650a-8e2a-7e59c1ca0faa.png)

それぞれConfigure Flip!（ラバートイのFlip）、Configure Lava（溶岩）、Configure Tank（貯槽）、Configure Beach Tank（ビーチ）、Configure Ocean Layer（海洋）、Configure Wave Tank（波）が用意されています。

Configure Lava（溶岩）を呼び出した場合の例：以下のネットワークができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/18ccee07-731f-e0b2-ddde-e6d9eeb5fa4f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d58b9f9a-854e-0df4-b286-e4b26359dba7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c1f2c8ca-291b-b9fb-ae4e-76c15f739349.png)

# まとめ

Flip Solverノードは、SOP上で流体シミュレーションを行うことができます。SideFXが用意してくれているプリセットを学ぶことで、よりFlip Solverノードの使い方をより深く理解できます。