JKになりたい

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

Houdiniで制作したSmokeシミュレーションを連番テクスチャとして吐き出してUnityで利用するまで。

HoudiniでPyroエフェクトを使ったボリュームのシミュレーションを試していたんですが、これどうやってゲーム制作で使うんだ?と思い調べて試した記録です。

結論、Texture Sheetとしてフレーム単位で2Dイメージを出力したものを使うのが良さそうなので、そちらを試してみました。

SideFX Labsの導入

今回使用するTexture SheetsノードはSideFX Labsに含まれるものなので、もし入っていない場合は入れておきます。

www.sidefx.com

ちょっと前まではGameDevToolsと呼ばれていたとのこと。ゲーム開発以外にも使えるということのアピールのために、名前が変わったんですかね。

Texture Sheetsの利用

カメラとMantra Render Nodeは既に設置してある前提で、Mantraノードの下にLabs Texture Sheetsノードを設置します

f:id:sakata_harumi:20210606215538p:plain

設定はこんな感じ。

だいたいこちらを参考に進めました。

support.borndigital.co.jp

TextureSheets

  • Export Normal, Render RGB Lightsにチェックを入れる
    • ノーマルマップも欲しいので
  • Nodes→Node To Renderにレンダリングしたいobjを指定
  • Settingsにいい感じのResolutionとImages per Lineをセットする
    • Override Resolutionにもチェックを入れておく

f:id:sakata_harumi:20210607000636p:plain

Mantra

  • Images→Extra Image Planes→Shading Normalにチェックを入れる
  • Objects→Exclude Lightsに「@rgb_lightrig」と入力 f:id:sakata_harumi:20210607005720p:plain f:id:sakata_harumi:20210607005917p:plain

Render RGB Lightsにチェックを入れておくと、良い感じにノーマルマップが生成されるらしいです。

Render RGB Lightを有効にすると、下記画像のように軸に合わせてR、G、Bの6個のライトが作成されます。

Volumeのノーマル情報を出力することは大変ですが、Houdiniのこの拡張機能では2つの方法をブレンドして可能にしています。Houdiniはデフォルトでボリュームのグラディエントをレンダリングする機能があります。それが下記画像のVolume Normalsとなります。こちらはDetailを保持します

(引用: Houdini Game Dev Tools:Texture Sheetsのリアルタイム合成を行う – Born Digital サポート )

なるほどわからん

これで、レンダリングするとTexture Sheetが出力されます。・・・と、結構簡単にできそうなものなんですが、実はいくつかハマりました。

(Emission Layerの出力と利用についてはまだ試せてないので、またそのうち試してみようと思います)

アスペクト比がおかしい

カメラのResolutionを512x512で設定して、とりあえずRenderしてみると以下のようにアスペクト比が崩れたTextureSheetが出力されてしまいました。

f:id:sakata_harumi:20210607001553p:plain

こちらの解消方法なんですが、どうやらOverride Camera Resolutionにチェックを入れると、良い感じにTextureSheetsのサイズに応じて良い感じに調整して出力してくれるようです。

こちらにチェックを入れない場合、自分でImages per Line、Resolutionを調整し正しいアスペクト比で出力されるようにしないといけないようです。

まだアスペクト比がおかしい

実は、Override Camera Resolutionにチェックを入れても直ぐには上記事象は解決しませんでした・・。

こちらの原因は、上記の変更後「Render Color Map」を押下してTexture Sheetを書き出していたからのようです。

Color Mapはシーケンスデータから生成されるので、シーケンスデータを再生成しないと先ほどの設定は反映されません

素直に全て再Renderすると無事うまくいきました。

f:id:sakata_harumi:20210607002144p:plain

f:id:sakata_harumi:20210607002114p:plain

ノーマルマップも良い感じに生成されてます!

Unityで取り込むと透過されない

EXRで出力していたのですが、UnityにSpriteとしてロードすると原因不明ですがうまく透過されませんでした

f:id:sakata_harumi:20210607003615p:plain

今回は諦めてEXR→PNGに変換することで解消しました( ;∀;)

せっかくなのでHDRのまま使いたいんだけどなあ

VFX Graphを作成

最後に、VFX Graphを作ってUnityで再生できるようにします。

グラフはとても簡単。

f:id:sakata_harumi:20210607010626p:plain

Flipbookを利用して連番アニメーションを再生します。

また、せっかく作成したノーマルマップを使いたいのでOutput Contextをデフォルトのものから Lit Quadに変更します。

完成

これで無事UnityにSmokeシミュレーションの結果をもってくることができました。

ノーマルマップを使うか使わないかで、結構質感が変わりますね。Emissionも試してみたいところ。

(ノーマルマップなし)

youtu.be

(ノーマルマップ利用)

youtu.be