【Blender】  2.82で流体シミュレーション

# 動作環境
本記事の動作環境は以下の通りです。
 
| 項目             |               環境 |
|:-----------------|:------------------|
| OS               |         Windows 10 | 
| Blender          |               2.82 |

# 参考サイト
以下の動画、サイトを参考にしております。

| 参考サイト        |                   |
|:-----------------|:------------------|
| シミュレーション解説動画           | [https://www.youtube.com/watch?v=laao-TTfESg](https://www.youtube.com/watch?v=laao-TTfESg)      | 
| 水マテリアル解説動画           | [https://www.youtube.com/watch?v=CRNCEaXXTuQ](https://www.youtube.com/watch?v=CRNCEaXXTuQ)      | 
| 公式マニュアル  | [https://docs.blender.org/manual/ja/2.82/physics/fluid/introduction.html](https://docs.blender.org/manual/ja/2.82/physics/fluid/introduction.html) |  

# 全体のワークフロー

Blender 2.82マニュアルより、ワークフローは以下の通り。

1. ドメインオブジェクトの作成
2. flowオブジェクトの作成
3. エフェクタオブジェクトの作成(必要に応じて)
4. ドメインオブジェクトにマテリアルの割当
5. 一旦ファイルを保存
6. シミュレーション用のキャッシュをベイク

![outline_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/80efdd64-232d-82e7-c51d-146bb7b60d20.png) &emsp;&emsp;&emsp; ![outline.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/49d9ea9f-3571-a6c9-40bd-58841f1de9b4.gif)



# ドメインオブジェクトの作成

### ドメインオブジェクトとは
シミュレーションを適応させる範囲のこと。

### ドメインオブジェクトの作成方法

主な作成方法は以下の通り。

1. ドメインオブジェクトを追加
2. 物理演算プロパティ>流体を選択
3. タイプはドメインを選択
4. ドメインタイプは液体

![domain.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/857d52fa-7fc7-2ea2-0583-8d109cab76d4.png)

### 補足：拡散>粘度のプリセット

Blenderでは初期で以下の粘度のプリセットが用意されている。
ドロドロした液体のシミュレーションをしたい場合は使ってみよう。

- Honey 
- Oil
- Water

粘度は以下の式で決まるようなので手動で設定することも可能。

**&emsp;粘度 ＝ ベース × 10 ^ (指数× -1)**

![domain_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/324fb4bb-5600-5838-5139-ae8911673203.png)


### 参考

[https://docs.blender.org/manual/ja/2.82/physics/fluid/type/domain/index.html](https://docs.blender.org/manual/ja/2.82/physics/fluid/type/domain/index.html) 

# flowオブジェクトの作成
### flowオブジェクトとは
液体そのもののこと。

### flowオブジェクトの作成方法
1. flowオブジェクトを追加
2. 物理演算プロパティ>流体を選択
3. タイプはフローを選択
4. フロータイプは液体
5. フローの挙動は任意
6. 初期速度も任意

![flow.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/ce95836f-2656-1284-f902-766e9c4f7e22.png)

### 参考

[https://docs.blender.org/manual/ja/2.82/physics/fluid/type/flow.html](https://docs.blender.org/manual/ja/2.82/physics/fluid/type/flow.html) 


# エフェクタオブジェクトの作成(必要に応じて)
### エフェクタオブジェクトとは
障害物のこと。

### エフェクタオブジェクトの作成方法

1. エフェクタオブジェクトを追加
2. 物理演算プロパティ>流体を選択
3. タイプはエフェクタを選択
4. エフェクタータイプはコリジョン

![efector.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/8add2d4d-29dd-b1c4-1e12-791224c32b32.png)

### 参考

[https://docs.blender.org/manual/ja/2.82/physics/fluid/type/effector.html](https://docs.blender.org/manual/ja/2.82/physics/fluid/type/effector.html) 

#ドメインオブジェクトにマテリアルの割当

### マテリアルの作成方法
1. マテリアルを新規作成。
2. プリンシプルBSDFで以下を設定。
    - ベースカラー：必要に応じて好きな色を選択
    - 粗さ ： 0(ツルツルに)
    - IOR ： 1.333(水の屈折率)
    - 伝播 ： 0.8 ~ 1 (任意の透過度)
    - アルファ(IOR反映なし)： 0.7 ~ 1 (任意の透明度)
        - 参考：[https://bluebirdofoz.hatenablog.com/entry/2019/10/05/091604](https://bluebirdofoz.hatenablog.com/entry/2019/10/05/091604) 



3. Shift + a > テクスチャ > ノイズテクスチャ を追加
4. Shift + a > ベクトル > バンプ を追加
5. 以下を結線
   - ノイステクスチャノードのカラー － バンプノードの高さ 
   - バンプノードのノーマル － プリンシプルBSDFのノーマル

6. 以下を適宜変更して水っぽくする
   - ノイズテクスチャの拡大縮小
   - バンプの強さ
   
7. 以下を使用してノイズの位置を変更することができる
    1. Shift + a > ベクトル > マッピング を追加
    2. Shift + a > 入力 > テクスチャ座標 を追加
    3. 以下を結線
        - テクスチャ座標の生成 － マッピングのベクトル(入力)
        - マッピングのベクトル(出力) － ノイズテクスチャのベクトル
8. マテリアルプロパティ>設定>ブレンドモードをアルファハッシュに変更する

![texture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/b1d091d8-82db-9e48-8f96-455f439b7e8d.png)

# 一旦ファイルを保存
ベイクをする前に一旦ファイルを保存しておきましょう

# シミュレーション用のキャッシュをベイク

### (キャッシュを)ベイクとは
シミュレーションをレンダリングするための前処理を行うこと。

### キャッシュをベイクする方法

以下の方法でベイクができる。
1. ドメインオブジェクトの物理演算プロパティ>設定>データをベイク
2. ドメインオブジェクトの物理演算プロパティ>メッシュ>メッシュをベイク

![bake.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/3cd2c57d-b4f5-a60a-98eb-6683f4abbdf0.png)


キャッシュのパスに日本語が入っているとうまくベイクできないことがあるようなので注意する。

![bake_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/7f65aa66-2b68-32af-59b0-3bddc801e34f.png)

### 補足：シミュレーションのやり直し方法

パラメータを変えてシミュレーションをやる直したい場合、以下の方法で可能。

1. ドメインオブジェクトの物理演算プロパティ>メッシュ>メッシュを解放
2. ドメインオブジェクトの物理演算プロパティ>設定>データを解放

直接2をすることも可能。必要に応じてベイクを開放していけば良さそう。

![bake_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/67f980a1-234b-8c82-3647-141cce90af25.png)


# 蛇足：流体シミュレーションは必要か？

水のマテリアルがあれば、ある程度の表現は可能。
必要に応じて物理演算シミュレーションを使うか、モデルファイアで対応するかを決めると良い。

### 水面の作成方法① Displace モデルファイアー ＋ クラウドテクスチャ ＋ Empty

![wave1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/2f94f25a-3de7-7ae4-c031-fbefb0941304.gif)

以下の方法で作成する。

1. 平面オブジェクトに水マテリアルを割当
1. 平面オブジェクトを細分化
1. Displaceモデルファイアを設定(適応はしない)
   - 強さを小さくしておく (目安：0.1以下)
1. クラウドテクスチャを作成
1. スムーズシェードを設定 
1. Emptyを追加
1. Displaceモデルファイアの設定を以下に変更
   - テクスチャ座標：オブジェクト
   - オブジェクト：Empty
1. Emptyの位置を適宜変更

![displace.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/7eb755ba-4705-ad9d-c229-05edf355ba03.png)
![displace_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/9a2ede3c-1d85-ec2e-f02f-f0ca827f89d0.png)




### 水面の作成方法② Displace モデルファイアー ＋ クラウドテクスチャ ＋ 波モデルファイアー

![wave2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/84c22da7-d24f-ad18-06e5-a94ab73edbba.gif)


スムースシェードを設定するところまでは水面の作成方法と同じ。
以降は以下の手順。

1. 波モデルファイアーを追加
1. 位置・減衰・速度・高さ・幅・狭さ などを適宜変更

![wave.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/0debfc7c-9a9b-8408-45dd-c9b029dcf288.png)


### 水面の作成方法③ 海洋 モデルファイアー 
![wave3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/8aff170b-c2e8-3674-d820-7ccce3b01552.gif)

以下の方法で作成する。

1. 平面オブジェクトに水マテリアルを割当(ノイズ・バンプノードは不要)
1. 海洋モデルファイアを設定

特に分割をしなくてもポリゴン数が増えてしまうので注意。
ランダム性が必要でない場合はリピートで対応することでポリゴン数の増加を低減できる。

![ocean.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/51bbf352-9b82-05d2-7d2a-27d64a4fe713.png)


# あとがき
静止画で川を作りたくて調べたものの覚書。
水面とか、湖面とか、静止画や簡単な動画程度ならマテリアルかモデルファイア程度でいいかも。
エフェクタを用意して、水しぶきまで表現したいならやっぱり流体シミュレーションかな。
パーティクルなるものも気になる…