【Houdini】煙で衝撃波エフェクトっぽいものを作ってみた


## はじめに
Houdiniを使って以下のような煙エフェクトを作ってみました。　
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/c076c573-5a10-4d17-d8e0-a3037e2c1ee8.gif)

Netflixで配信されているケンガンアシュラのOPの煙エフェクトを見た時に思いつきました。

<br>
今回はこのエフェクトの作り方を軽くご紹介いたします。

## STEP1 : 煙の発生元のジオメトリ作成
まずはobj階層にgeometryノードを作成します。　ノード名はSourceとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/92df62d0-85c3-13ac-368e-e1a89705215e.png)


Sourceノードの中に入り、Tubeノードを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/2290bdae-4e6d-7f1a-eddf-19dd81dc03d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/ce30df93-2658-1837-3185-2a5718d7ada2.png)

以下のようなモデルが作成されます。
今回はこのモデルを煙の発生源として使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/76e192cf-c59b-e8f9-9e40-138875e504e6.png)

## STEP2 : 煙シミュレーションの作成
Sourceノードをクリックした状態でBillowy Smokeシェルフをクリックして、煙エフェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/5bc7ce2a-2a22-f6c5-eee1-6e521aeee366.png)

obj直下に煙に関連するノード群が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/4e99e9f6-d56d-12b3-d908-28f11a7a44a9.png)

## STEP3 : Sourceノードに手を加える(速度の追加)
### Sourceノードの中身
Sourceノードの中に入ると、以下のようなノード構成になっています。
先ほど作成した**tube1**が最終的に
density(密度)とtemperature(温度)を持ったボリュームとして出力されるようなノード構成となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/26ebd968-a3d8-d2ce-0271-fac66aef8478.png)


これらのノードのパラメータを変更することで、煙のふるまいが調整できるようになっているので触ってみると面白いと思います。

### 速度vを持つボリュームを追加する
ここに、以下のようなノード群を新しく追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/c3d990f8-276e-5ca7-3271-f55f39c193c3.png)

#### Boundノード (箱の作成)
tube1を覆うような箱(バウンディングボックス)を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/fc3f6fd3-16b9-7ebb-19cc-a30f3b6a9a17.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/d54a9a14-f699-084e-4db8-0b5ab8b3f52b.png)

#### VDB from Polygonsノード(ボリュームに変換)
モデルをボリュームに変換します。
ここではFog VDBのチェックを入れることで、densityを持ったボリュームを作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/1fa54717-520f-d2c8-83c0-2167ee9da430.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/1575532d-fcc4-a3a0-f86e-493ff8267e58.png)

#### Scatterノード(ポイントをばら撒く)
densityを持ったボリュームにScatterを適用し、ポイントをばら撒きます。
今回はdensityが偏りなく分布しているため、ポイントも偏りなくばら撒かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/c64bb6ce-289c-9297-9009-4f3da2cf331d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/48a16eb4-9f65-32da-987f-d6a8b41408ab.png)

#### Attribute Wrangleノード(速度フィールドの作成)
速度アトリビュート```@v```を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/24e119cf-6376-25c5-de49-8b377d55e3cb.png)


原点を中心としてxz方向に放射状に広がる速度の大きさをコントロールするパラメータ```vel_side```と、
y方向の速度の大きさをコントロールするパラメータ```vel_up```を使って速度```@v```を合成しています。

```python:attributewrangle1
vector np = normalize(@P) * chf("vel_side");
v@v = set(np.x, chf("vel_up"), np.z);
```

速度```@v```をVisualilzeノードで可視化すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/55e220f0-606d-fdfc-c321-fa7b9ac7c477.png)

### Attribute VOP(速度vにノイズを合成する)
Attribute VOPを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/00c1b95c-2039-15c1-9c29-7c9bbe56368c.png)

Attribute VOPの中ではTurbulent Noiseノードを利用して速度vにノイズを合成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/70f074c1-052e-13c7-7595-493751910b59.png)

ノイズのパラメータは以下のように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/407150aa-f790-748e-0f44-a6b0cd637462.png)


### VDB from Particles(ポイントをボリュームに変換)
最後にVDB from Particlesを使ってポイントをボリュームに変換します。
Attribute の部分にvを設定することで、ポイントが持つアトリビュート```@v```をボリュームに持たせています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/2c7dd040-d788-f6bf-016a-97e67cd23d8b.png)

### Nullの作成
最後にNullノードを接続し、速度を出力するものだということを明示するためにノード名をOUT_VELとして完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/90c44172-b152-b40d-1223-9f9bd80a18cd.png)

### ノード全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/12273dfa-4cb5-6aaf-bde8-aae18b8ebf22.png)

### 補足 : Visualizeノードを利用した速度の可視化
Visualizeノードを以下のように設定すると速度```@v```を表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/d67ee518-e1ad-ad98-a2b0-cc6b7d72df3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/55e220f0-606d-fdfc-c321-fa7b9ac7c477.png)

## STEP4: pyro_simに手を加える

### pyro_simの中身
obj直下にあるpyro_simの中に入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/07401008-7f32-8520-acd3-50905fa6780f.png)

pyro_simの中は以下のようなノード構成になっているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/e3866749-0af4-06cf-918b-caaa884d25bd.png)


### pyro_simから速度フィールドを参照する
Volume Sourceノードを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/fc4a09b3-e2b7-631c-4249-b4b51b1fc050.png)

Volume Sourceのパラメータは以下のように設定します。
先ほど作成したOUT_VELノードが持つ速度vを煙の速度velに毎フレーム加算するような設定にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/d7a12f96-e571-fdbd-4b0d-e8556286752f.png)

作成したVolume Sourceノードをpyro_simの左から3番目のインプットコネクタに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/2270266c-1cf8-29cb-1139-5637f1c6065d.png)

以上で煙のシミュレーションで速度vが利用されるようになります。

### density(密度)を変更する
pyro_simの中に元から居る source_density_from_Source　は以下のようなパラメータ設定にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/539975f4-7fd1-c04b-7de0-74a23e9ea8d0.png)

### pyro_solverの設定
pyro_solverのパラメータも変更します。
今回触るのはSimulationとShapeの二つです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/b4d9a6cf-641b-931b-58f4-6525699b8ced.png)

#### Simulationタブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/a4c3f17f-81d5-506c-20b7-f1aa53552a1b.png)

#### Shapeタブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/592bbfb2-085d-74ef-d81f-64207155400a.png)


## 完成
ここまでの設定を終えると、以下のような煙になるはずです。(ならなかったらごめんなさい)
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/a19a98b6-62a7-46e7-6732-d54665068145.gif)