HoudiniのパーティクルシミュレーションをUnityのVFX Graphで再生する


HoudiniのパーティクルシミュレーションをUnityのVFX Graphで再生したいと思います。


使用しているバージョンは次の通りです。

**Houdini:** 19.0.455
**SideFXLabs:** 19.0.455
**Unity:** 2021.2.9f1
**Visual Effect Graph:** 12.14

流れとしては次のように、Houdiniで作成したパーティクルシミュレーションの位置や色といった情報をテクスチャに書き出し、そのテクスチャをUnityで読み込んでVFX Graphで使用します。

1. Houdiniでパーティクルシミュレーションの作成
1. Houdiniでパーティクルシミュレーションのテクスチャ書き出し
1. Unityでテクスチャの読み込み
1. UnityでVFX Graphの作成

先に結果を載せると、上がHoudiniでのパーティクルシミュレーションで、下がそれをUnityのVFX Graphで再生したものになります。

![HoudiniFlipbook.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/7ab449dd-c59a-559d-f55d-c3109f9f5ba6.gif)
![UnityRecord.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/a80a343d-3434-e926-c552-8fd516ed3b4b.gif)


## 1. Houdiniでパーティクルシミュレーションの作成

まず、HoudiniでPOPを使ってパーティクルシミュレーションを作成します。`OUT_Particles`がテクスチャ書き出しの対象になりますが、今回はパーティクル位置にメッシュを配置したいので`copytopoints1`でボックスを配置しています。
![HoudiniSop.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/47b1071c-d84d-2916-bf3f-8a0353355f30.png)
`dotnet1`の中は次のようになっています。`popwind1`でノイズを追加して、`popwrangle1`で`@nage`をもとに`@pscale`を設定しています。
![HoudiniDop.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/08d74bb3-131f-efe9-dd04-88796fac95c2.png)

## 2. Houdiniでパーティクルシミュレーションのテクスチャ書き出し

作成したパーティクルシミュレーションを`Labs Vertex Animation Texture`ROPを利用してテクスチャに書き出します。
`Labs Vertex Animation Texture`ROPのパラメータを次のように設定します。

- **Mode / Target Engine:** Particle Sprites(Sprite) / Unity
- **Input Geometry:** (対象のジオメトリ)
- **Settings:**
    - **Export Custom Attributes:**
        - **In Color:** v
- **Export:**
    - **Include:** Decide Individually
    - **Geometry:** オフ
    - **Unity Material:** オフ

![HoudiniVat1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/5d58fbf5-44f1-3d8b-ab05-f1e16762e264.png)
![HoudiniVat2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/03449a27-c51d-9efe-87c8-c1521f05c2cc.png)
今回は、Houdini側で用意しているVertex Animation Texture用のジオメトリやマテリアルは使用しないのでエクスポートをオフにします。また、パーティクルの色は不要なので、その代わりにカラー用のテクスチャには`v`アトリビュートを書き込んでいます。これはVFX Graph側でパーティクルの方向を表すために使用します。

設定が完了したら、**Render All**を押してテクスチャを書き出します。

書き出したテクスチャには、それぞれ次の情報が格納されます。

- **/tex/{OS}_pos.exr:** RGBに`P`、Alphaに`pscale`
- **/tex/{OS}_col.exr:** RGBに`v`

以上でHoudini側の作業は終わりです。

## 3. Unityでテクスチャの読み込み

Houdiniで作成したテクスチャをUnityに読み込み、Import設定を次のように変更して**Apply**します。

- **sRGB:** オフ
- **Advanced:**
  - **Non-Power of 2:** None
  - **Generate Mip Maps:** オフ
  - **Filter Mode:** Point(no filter)
- **Default:**
  - **Compression:** None

![UnityTextureImportSetting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/552ae1c7-f47e-8e6b-7253-d4f15149c2da.png)

## 4. UnityでVFX Graphの作成

VFX Graphで次のようにネットワークを組みます。Experimentalなノードを使用しているので**Preferences > Visual Effects > Experimental Operators/Blocks**をオンにする必要があります。
![UnityVfxGraph.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/faa28d53-8c20-6db9-fdeb-f5e458989dc2.png)

プロパティにはそれぞれ以下の値を設定します。

- **Position Texture:** Houdiniから書き出した/tex/{OS}_pos.exr
- **Velocity Texture:** Houdiniから書き出した/tex/{OS}_col.exr
- **Frame Count:** シミュレーションのフレーム数
- **FPS:** シミュレーションのフレームレート

このVFX Graphをシーンに配置することでHoudiniのパーティクルシミュレーションをUnityで再生することができます。