【Houdini VAT + Unity】トゥーン調の水しぶきを作ってみた
Houdiniを利用して、水しぶきエフェクトを作ってみました。
使用ツール
- Houdini 18.5 Indie
- Unity 2020.3.13f1
- Universal RP 10.5.0
作成手順
- Houdiniを使って水しぶきのシミュレーション
- シミュレーションのVertex Animation Texture化
- Unity上で再生
Houdiniを使った水しぶきのシミュレーション
Houdiniで以下のような水しぶきを作成する手順を紹介します。
シミュレーション01 : 球を水面に落下させる
まずは、以下のようなシミュレーションをセットアップしてみたいと思います。
球を水面に落とすようなシミュレーションです。
手順1 : FLIP Tank の作成
Particle Fluid シェルフから FLIP Tankを作成します。
水が溜まったタンクが作成されます。
手順2 : Sphere の追加・RBD Object化
Sphereを作成し、RBD Object シェルフを適用します。
Sphereの位置は以下のように設定し、水面の上に球が位置するような形にしておきます。
結果
ここまでを終えると、以下のようなシミュレーションになります。
シミュレーション02 : 水中から飛び出す球をつくる
次に、Sphereが水中から飛び出すようなシミュレーションをセットアップします。
手順1 : 球の配置を変える
球のTranslateやScaleを以下のように設定します。
球が水面の下に配置されます。
手順2 : シミュレーションの実行場所
obj階層を見るとAutoDopNetworkというノードがあり、このノードの中でシミュレーションが実行されています。
AutoDopNetworkの中身は以下のようになっています。
SphereとFLIP Tankの二つに対して重力が働くような構成になっています。
Gravityノードを見てみると、Y軸下方向に -9.80665 という重力加速度が設定されています。
手順3 : Sphereの重力を反転させる
ここで、シミュレーションを以下のように改造してみます。
- FLIP Tankの重力はそのまま
- SphereにはY軸上方向の重力を与える
AutoDopNetworkのGravityを以下のように組みなおします。
結果
球が水中から飛び出るようになります。
シミュレーション03 : 水の調整
水の柱ができてしまっていますが、
今回の表現では水の柱は邪魔なので無くしたいと思います。
FLIP Tankの位置の調整
obj/fliptank_initialの中にある、wavetankノードから水のシミュレーション領域の範囲を設定することができます。
CenterのY座標を 2.45 に設定し、Wave Tankの底が水面に少しだけ埋もれるようにします。
結果
球が飛び出た後に水柱が出なくなります。
シミュレーション04 : 水の密度を上げる
AutoDopNetworkの中のfliptankノードにParticle Separationというパラメータがあります。
デフォルト値は0.075ですが、数値を下げることにより水の密度を上げることができます。
Particle Separation = 0.02 に設定すると、以下のようになります。
水しぶきのメッシュ化
水しぶきシミュレーションを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をシーンに配置し、マテリアルを割り当てます。
結果
以下のような水しぶきが表示されます。
VATシェーダーを改造
今回使用したVAT_Fluid_SGシェーダーは、Packagesの中にあります。
こちらを複製し、Unityプロジェクトへ持ってきます。
シェーダーの名前は VAT_Fluid_SG_Unlit としておきます。
シェーダーはUnlitにします。
Colorプロパティを作成し、MasterノードのBaseColorへ接続します。
結果
以下のようなべた塗りになります。
Discussion