追記
本記事で利用しているHoudiniで作成したVolumeTextureを以下に公開しておきます。 こちら利用すれば、Houdiniをもっていない方でもお試しできます。
いつまで公開しているかは未定。ダウンロードできなかったらごめん。
はじめに
以前、この記事でHoudiniで作成したPyro Simulationのデータを2Dテクスチャに吐き出し、UnityのVFX GraphでFlip bookを利用してアニメーションさせる手順を記載しました。
これは、もちろんUnreal Engine上でもNiagaraを使って簡単に同じことができます。
ただし、2Dのテクスチャだとユースケースが限られます。比較的遠景であれば気にならないかと思いますが、やっぱり「立体感」が欲しいです。
立体感のあるSmoke表現は、Niagaraを使ってパーティクルを立体的に配置し、それらのレンダラをスモークっぽいものにしてFlip bookアニメーションさせる、、みたいなやり方もあるかと思います。
しかし、このやり方は複雑なSmokeシミュレーションでは難しいかと思います。自分はかなりこの辺り疎いので、凄い人がやればいい感じになるんだとは思いますけど。
というわけで、今回は「複雑なSmokeシミュレーションを立体感をもって表現する」方法としてVolume TextureとRay Marchingを利用したアプローチを試してみたいと思います。
以下手順。
1. HoudiniでPyro Simulationをして、結果をテクスチャに書き出す
Pyro シミュレーションの実装は割愛します。かなり適当に作ったものです。。実装はシンプルですが、内容は色の付いた煙が混ざっていく複雑な表現になっています。
SOPとDOPの全体像と、プレビューの動画を張り付けておきます。
SOP
DOP
プレビュー
いい感じ。
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してすぐ再生してしまうとカクカクするためです。プリロールタイムを適切に置いてあげることが必要です。
結果
できた!