💦

【Houdini VAT + Unity】トゥーン調の水しぶきを作ってみた

2021/07/03に公開

Houdiniを利用して、水しぶきエフェクトを作ってみました。
https://www.youtube.com/watch?v=Oyw6nxhQciQ

使用ツール

  • Houdini 18.5 Indie
  • Unity 2020.3.13f1
  • Universal RP 10.5.0

作成手順

  1. Houdiniを使って水しぶきのシミュレーション
  2. シミュレーションのVertex Animation Texture化
  3. Unity上で再生

Houdiniを使った水しぶきのシミュレーション

Houdiniで以下のような水しぶきを作成する手順を紹介します。

シミュレーション01 : 球を水面に落下させる

まずは、以下のようなシミュレーションをセットアップしてみたいと思います。
球を水面に落とすようなシミュレーションです。
https://www.youtube.com/watch?v=FnBh3lA85iI

手順1 : FLIP Tank の作成

Particle Fluid シェルフから FLIP Tankを作成します。

水が溜まったタンクが作成されます。

手順2 : Sphere の追加・RBD Object化

Sphereを作成し、RBD Object シェルフを適用します。


Sphereの位置は以下のように設定し、水面の上に球が位置するような形にしておきます。

結果

ここまでを終えると、以下のようなシミュレーションになります。
https://www.youtube.com/watch?v=FnBh3lA85iI

シミュレーション02 : 水中から飛び出す球をつくる

次に、Sphereが水中から飛び出すようなシミュレーションをセットアップします。
https://youtu.be/e4-AAenQ5Ek

手順1 : 球の配置を変える

球のTranslateやScaleを以下のように設定します。

球が水面の下に配置されます。

手順2 : シミュレーションの実行場所

obj階層を見るとAutoDopNetworkというノードがあり、このノードの中でシミュレーションが実行されています。

AutoDopNetworkの中身は以下のようになっています。
SphereとFLIP Tankの二つに対して重力が働くような構成になっています。

Gravityノードを見てみると、Y軸下方向に -9.80665 という重力加速度が設定されています。

手順3 : Sphereの重力を反転させる

ここで、シミュレーションを以下のように改造してみます。

  • FLIP Tankの重力はそのまま
  • SphereにはY軸上方向の重力を与える

AutoDopNetworkのGravityを以下のように組みなおします。

結果

球が水中から飛び出るようになります。
https://youtu.be/e4-AAenQ5Ek

シミュレーション03 : 水の調整

水の柱ができてしまっていますが、
今回の表現では水の柱は邪魔なので無くしたいと思います。

FLIP Tankの位置の調整

obj/fliptank_initialの中にある、wavetankノードから水のシミュレーション領域の範囲を設定することができます。

CenterのY座標を 2.45 に設定し、Wave Tankの底が水面に少しだけ埋もれるようにします。

結果

球が飛び出た後に水柱が出なくなります。

https://youtu.be/YXrI3umA4GA

シミュレーション04 : 水の密度を上げる

AutoDopNetworkの中のfliptankノードにParticle Separationというパラメータがあります。
デフォルト値は0.075ですが、数値を下げることにより水の密度を上げることができます。

Particle Separation = 0.02 に設定すると、以下のようになります。
https://youtu.be/v1NdrbYSLDg

水しぶきのメッシュ化

水しぶきシミュレーションをUnityへ持っていくためにはメッシュへ変換する必要があります。

手順1 : 不要なノードを非表示にする

obj階層にて、fliptank_fluidノード以外のDisplayフラグをOFFにしておきます。
他ノードのDisplayフラグがONになっていると、余計な処理が走るので重くなってしまいます。

手順2 : パーティクルのメッシュ化処理

fliptank_fluidの中を見ると、パーティクルをメッシュ化するようなノードがすでに構築されているので、これを改造します。

手順3 : シミュレーションのキャッシュ化

流体シミュレーションは重いため、
シミュレーションのキャッシュをPCのストレージにいったん保存しておき、
以後はキャッシュを使いまわす形で作業を進めていきます。

import_fliptankの下に File Cache ノードを作成し、Save to Disk ボタンを押してキャッシュを保存します。

保存が終わったら、Load from Disk のチェックを有効にしておきます。

下流のノードでは、シミュレーションは行われずにディスク上に保存されたキャッシュが利用されるようになります。

手順4 : 不要なパーティクルを削除

今回の表現では水面のパーティクルは不要なので、削除します。
Deleteノードを使用して、Y座標がしきい値を下回るパーティクルを削除することで、水面を取り除くことができます。

手順5 : パーティクルのメッシュ化

Deleteノードの下に、Particle Fluid Surface を接続し、メッシュ化します。

Influence Scale (パーティクルがつながる距離)や、Droplet (水の粒の大きさ)の数値を調整すると水の形状をコントロールできます。

メッシュ形状のコントロール

メッシュのVAT出力

手順1 : Vertex Animation Texture ノードの作成

out階層へ移動し、Labs Vertex Animation Textures ノードを作成します。
(Side FX Labs を導入しておく必要があります)

手順2 : ノード設定

Unity用のFluidを出力するような設定にします。

VATの出力先のパス、モデルの頂点数、テクスチャの解像度などを指定します。

Renderボタンを押すと、テクスチャ・Unity用マテリアル・メッシュの3つが出力されます。

Unity上でVATを使うための準備

手順1 : Unityパッケージ用パスのコピー

VATをUnityで使うためには、VAT用のシェーダーを導入する必要があります。

Vertex Animation Texture ノードの Sample Shader Code タブから Unity Packageのパスをコピーします。

以下のようなUnity パッケージのファイルパスがコピーされます。

{Houdiniインストールパス}/packages/../SideFXLabs/18.5.563\SideFXLabs18.5/unity/shaders/URP

このファイルパスは Unity の Package Manager にてVAT用シェーダーをインストールする際に使用します。

手順2 : Unityパッケージのインストール

UnityのPackage Manager から Add package from disk... を選択します。

先ほどコピーしたファイルパスにpackage.jsonがあるので、これをインストールします。

Package Manager に以下のような表示が出ればインストール成功です。

VATを動かす (Unity)

VAT出力時に生成されたデータをUnityへ取り込みます。

マテリアルの設定

マテリアルには、SideFX/VAT_Fluid_SGシェーダーを適用します。
Position Map という項目に Positionテクスチャを割り当てます。
(***_posのような名前のテクスチャがPositionテクスチャです)

テクスチャ設定

Positionテクスチャは以下のように設定します。

FBXへマテリアルをアタッチ

FBXをシーンに配置し、マテリアルを割り当てます。

結果

以下のような水しぶきが表示されます。
https://www.youtube.com/watch?v=74VxKikn1Js

VATシェーダーを改造

今回使用したVAT_Fluid_SGシェーダーは、Packagesの中にあります。

こちらを複製し、Unityプロジェクトへ持ってきます。
シェーダーの名前は VAT_Fluid_SG_Unlit としておきます。

シェーダーはUnlitにします。

Colorプロパティを作成し、MasterノードのBaseColorへ接続します。

結果

以下のようなべた塗りになります。

Discussion