Houdini使いの為のリアルタイムVolume入門

Houdini Advent Calendar 2023 3日目の記事です。
<br>

皆さんはUnreal Engine 5でのリアルタイム表現が今どうなっているかご存じでしょうか？

実写さながらの「駅の映像」や「FPSゲーム」についてご存じの方は多いかと思います。

https://www.youtube.com/watch?v=2paNFnw1wRs

https://www.youtube.com/watch?v=5qvVNzsJyB0

では、エフェクトについてはどうでしょう？

全く知らないという方がほとんどかもしれません。

しかし、実はUE5.3にて、とても大きな変化があったんです。（個人の感想です）

それは<b>スパースボリュームテクスチャ（SVT）の導入</b>です。
「スパース」と聞いて、Sparse Solver を想像された方もいると思いますが、
まさにその通りで、SVTとはコンパクトなボリュームデータのことを指します。

コンパクトなボリュームデータが導入されたことの何が大きな変化なのか？
と思われるかもしれませんが、実はSVT導入後の一番大きな変化は
<INS><b>「連番のVDBデータを簡単に扱える仕組みが用意された」</b></INS>ということなんです。
<br>
これによって、Houdiniで作った煙や爆発をUE5で読み込み、

<b>動的に変化するライティング環境の中、高速でレンダリングされる様子をニヤニヤ眺める</b>

なんてことも可能になりました。
<br>

どうです、魅力的だと思いませんか？

いまいちピンと来てない方でも大丈夫です。
後述の「UE5で出来るエフェクト表現（一部）」を見てもらえば、
「UE5スゲー！ SVT最高！ Houdiniでもっと遊べるドン！ 」と思うこと間違いなしです。
<br>
前置きが長くなってしまいましたが、
本記事によって皆さんのHoudiniライフがより楽しいものになることを願っています。



### <INS>注意</INS>
　本記事は <b>UE5.3.2</b> の情報を元に書かれています。
　今後のアップデートで仕様が大きく変わることが予想されますので、ご留意ください。

　また、UE5の基本的な操作についての説明はありません。




## UE5で出来るエフェクト表現（一部）

### ■ 雲

https://www.youtube.com/watch?v=-KtGzTWGom4

https://www.youtube.com/watch?v=EfJCWl_vaK0

### ■ 煙

https://www.youtube.com/watch?v=FGArQhJnG2w

https://youtu.be/WU0gvPcc3jQ?t=372

### ■ 水・海

https://www.youtube.com/watch?v=bIMYgIY4r0w

https://www.youtube.com/watch?v=RjEUzCpyWGA


### ■ 破壊

https://youtu.be/wZN2ZTzaDU4?t=35


## 爆発（VDB）をUE5で再生するには

#### <INS>1. シミュレーション結果をVDB形式で出力します</INS>
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/4632c787-d258-8293-65d2-ce9584f73522.png">


#### <INS>2. VDBファイルをインポートします</INS>

インポートオプションで、RGBAのそれぞれに任意のフィールドを設定します。
※ 設定できるフィールドは最大で8個です。
※ vectorフィールドは x, y, z を分けて設定する必要があります。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/9ba38714-f831-8ada-1c76-c8c403d4bc3f.png">

AnimatedSparseVolumeTextureアセット（SVT）が生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/a76ecf55-60a6-aa43-173d-da26e36337cc.png)

#### <INS>3. SVTアセットを開いて、X, Y, Z-axis Tiling Method を Clampにします</INS>
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/bd2cbf1f-613f-bf45-e5dc-64e776c23619.png">

#### <INS>4. 新しくMaterialアセットを作ります</INS>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/2fdfa08b-e874-469a-9233-613af533b7f9.png)


Material Domeinを <b>Volume</b>, Blend Modeを <b>Additive</b> にします。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/59fbff82-32fb-9136-31d3-3d92b4738ccb.png">

下図のようにネットワークを組みます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/8113e1f0-8997-5893-b55a-12095a97ca5c.png">
※ 分かり易くするため、マテリアルは最低限の構成にしています。
<br>

SVTパラメータ（Sparse Volume Texture Sample Param）の中に、SVTアセットを設定します。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/a42c3e1b-0004-b0c9-29fc-d921891ae045.png">


#### <INS>5. レベルにHeterogeneous Volumeアクタを追加します</INS>
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/0092f942-3188-2d46-1810-9fbb9c454872.png">

<b>4.で作ったマテリアルを割り当て</b>、<b>Playing</b> と <b>Looping</b> に<b>チェック</b>を入れます
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/a913a246-8fdf-7303-1346-3eaa3fe6da86.png">


#### <INS>6. ループ再生されます</INS>
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/4acbc331-168a-3cd2-5684-4f4467d09236.png">


## Heterogeneous Volume Rendering の問題点（Ver 5.3.2）

上記で紹介したVDBを再生する方法には、問題点が一つあります。
#### <INS>Volume同士のブレンドがいい感じにならない</INS>
カメラに近いVolumeが遠くのVolumeを上書きしてしまいます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/9527318d-2a88-8d34-8149-2de0f38ab16e.gif">
　

## Niagara Fluidsとの比較

UE5にはNiagara Fluidsという流体シミュレーションをゼロから作れるテンプレートがあり、
これを使うとゲーム内のオブジェクトとインタラクションさせることが出来ます。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526231/986a3b7a-efd1-1f0a-8816-4ad46e07a521.gif">

しかし、Niagara Fluidsは非常に複雑であり、ちゃんと扱うには高度な知識が求められます。
（Houdiniで例えると、Pyro Solverがなく、MicroSolverや流体計算式が剝き出しの状態です）

なので、ゲーム内オブジェクトとインタラクションさせる目的以外では
HoudiniからVDBをインポートする方が簡単です。

また、試したことはありませんが、VDBを発生源として使いNiagara Fluidsで
シミュレーションさせることが出来れば、お互いの共存も可能ではないでしょうか。

▼ Niagaraとは
https://docs.unrealengine.com/4.27/ja/RenderingAndGraphics/Niagara/
▼ Niagara Fluidsとは
https://docs.unrealengine.com/5.0/ja/niagara-fluids-in-unreal-engine/



## 最後に

如何だったでしょうか？
99％がUE5の話になってしまいましたが、UE5のアップデートと共に
Houdiniが活躍する場面も広がっていることを知ってもらいたくて記事にしてみました。

また、今回取り上げたVolume以外でも『Houdini x UE5』は色んな事が出来ます。
その一部のリンクを下に記載しておきますので、ぜひ試してみてください。

最後まで読んでいただき、ありがとうございました！

▼ Houdini Niagara
https://www.sidefx.com/ja/tutorials/realtime-fx-with-niagara-ue4/

▼ Houdini Engine for Unreal
https://www.sidefx.com/ja/products/houdini-engine/plug-ins/unreal-plug-in/