JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

VolumeTextureを使ってUnrealEngine上でHoudiniで作ったPyroシミュレーション(Smokeシミュレーション)を再生する

追記

本記事で利用しているHoudiniで作成したVolumeTextureを以下に公開しておきます。 こちら利用すれば、Houdiniをもっていない方でもお試しできます。

いつまで公開しているかは未定。ダウンロードできなかったらごめん。

ColorSmoke.zip - Google ドライブ

はじめに

以前、この記事でHoudiniで作成したPyro Simulationのデータを2Dテクスチャに吐き出し、UnityのVFX GraphでFlip bookを利用してアニメーションさせる手順を記載しました。

これは、もちろんUnreal Engine上でもNiagaraを使って簡単に同じことができます。

sakataharumi.hatenablog.jp


ただし、2Dのテクスチャだとユースケースが限られます。比較的遠景であれば気にならないかと思いますが、やっぱり「立体感」が欲しいです。

立体感のあるSmoke表現は、Niagaraを使ってパーティクルを立体的に配置し、それらのレンダラをスモークっぽいものにしてFlip bookアニメーションさせる、、みたいなやり方もあるかと思います。

しかし、このやり方は複雑なSmokeシミュレーションでは難しいかと思います。自分はかなりこの辺り疎いので、凄い人がやればいい感じになるんだとは思いますけど。


というわけで、今回は「複雑なSmokeシミュレーションを立体感をもって表現する」方法としてVolume TextureとRay Marchingを利用したアプローチを試してみたいと思います。

以下手順。

1. HoudiniでPyro Simulationをして、結果をテクスチャに書き出す

Pyro シミュレーションの実装は割愛します。かなり適当に作ったものです。。実装はシンプルですが、内容は色の付いた煙が混ざっていく複雑な表現になっています。

SOPとDOPの全体像と、プレビューの動画を張り付けておきます。

SOP

DOP

プレビュー

youtu.be

いい感じ。


Volume Textureを吐き出すにはSide FX Labsの「Labs VolumeTexture Export」ノードを利用します。(SOPの図、赤丸の部分)

これで、指定したディレクトリにフレーム分(今回は120フレーム分)のVolumeTextureのexrが作成されました。

2. Volumetricsプラグインを有効化

ここからUEでの作業になります。

Edit > Pluginsから「Volumetricsプラグイン」を有効にしておきます。

3. メディアソース、メディアテクスチャの作成

次に、「メディアプレーヤー」「画像メディアソース」「メディアテクスチャ」を作成していきます。

ここで、メディアプレーヤーのPlay on Openはオフにしておきましょう。

画像メディアソースの「シーケンスパス」に先ほど作成したVolumeTextureの連番exrファイルを設定していきます。

UEプロジェクトをパッケージ化する場合は、VolumeTextureのファイルを「/Content/Movies」以下に置いておく必要があることに注意です

ここハマりました。上の画像を見ると「/Content/Movie」ディレクトリに置けと警告が出ていますが、実際に作るディレクトリは「/Content/Movies」です。日本語訳のときに複数形のsが落ちてるんでしょうね。

エクスプローラ上で(UEプロジェクト上でではないです)先ほどエクスポートしたテクスチャファイルをMoviesディレクトリに移動させ、シーケンスパスを設定しなおします。

これで警告が消えているはずです。

4. Volumetricsプラグインのマテリアルからマテリアルインスタンスを作成

「Plugins/Volumetricsコンテンツ/VolumeTextures/Materials/Raymarching」以下にマテリアルがいくつかあります。

この中の「M_VolumeRayMarch_Lit_Preview」からマテリアルインスタンスを作成し、RT(レンダーターゲット)に先ほど作成したメディアテクスチャを設定します

そして、XYFramesのRとGにボリュームテクスチャの分割数のXとYに対応する値を設定します。今回は、縦横共に1枚のテクスチャに14個のタイルが設定されているので、以下のように設定しました。

このマテリアルインスタンスを、適当なプリミティブのマテリアルとして設定しておきます。

5.BPを記述してImage Sequenceを再生

こんな感じの適当なLevelBPを作って画像メディアソースを再生させるようにします。

メディアソースをOpenしてから再生するまでにDelayを挟んでいますが、これはOpenしてすぐ再生してしまうとカクカクするためです。プリロールタイムを適切に置いてあげることが必要です。

結果

できた!

youtu.be