こんにちは。今回は、Static Meshで表現する血しぶきの作り方を紹介します。
↓完成形動画
My latest favorite fluid VFX method. I came up on this idea when I wanted 3D flip vfx without VAT.#VFX #Houdini #RealTimeVFX #UnrelEngine #UE5 #GameDev pic.twitter.com/Xt4GQPb6M0
— kosuke/こすけ (@kmknksm) January 29, 2023
1. Houdiniで通常通りしぶきを作る
どんなアプローチでもいいので、パーティクルでしぶきを作ります。しぶきの作り方は素晴らしいチュートリアルがたくさんあるのでそちらを参考に
(例:https://vimeo.com/266717949)
2. メッシュ化し、Vertex Colorを作成する
しぶきがいい感じの形になっているところで、Timeshiftノードを使って止め、Particle Fluid Surfaceノードなどを使いメッシュ化します。その後頂点数、細かいしぶきの数などを調整し最適化します。
ここからはいい感じにディゾルブするための頂点カラーを適用します。
Distanceノードを使用し、しぶきの発生地点をoriginとしたアトリビュートを作成します。
distアトリビュートにノイズを少し入れます
このdistアトリビュートを頂点カラーとして使用したいのですが、値はしぶきのサイズによっては1を超えます。そこでこの値をプロシージャルにfit rangeする処理を追加したいと思います。
流れとしては
最小・最大値をdetailアトリビュートとして格納→pointアトリビュートにpromote→値をfitさせる
みたいな感じです。
なんか回りくどいな~とは思っていますが、今のところこれ以外思いつきません。もっといいやり方ご存じの方がいましたら教えてください・・・
最小・最大値を格納
//distアトリビュートをCdに適用
@Cd = @dist;
//fit rangeで参照するため、MinとMaxをDetail Attributeにセット
setdetailattrib(0, "cd_min", @Cd.r, "min");
setdetailattrib(0, "cd_max", @Cd.r, "max");
最小・最大値をpointアトリビュートにpromoteする
頂点カラーの値をfitさせる
@Cd.r = fit(@Cd.r,@cd_min,@cd_max,0,1);
@Cd.g = 0;
@Cd.b = 0;
これで、発生源から放射状にいい感じにグラデーションがついたstaticメッシュができました。
エクスポートしてUE5に読み込みます。
3. Vertex Colorを透明度に乗算したマテリアルを適用、Niagaraで発生させる
Vertex ColorとParticle Color、Dynamic Material Parameterなどと乗算し、Opacity Maskに適用したマテリアルを作ります。
*マテリアルのBlend ModeはMaskedです。
作成したメッシュ、マテリアルを使用したNiagara Systemで、いい感じにOpacityを調整します。
これで、アルファチャンネルでいい感じに消える血しぶきの完成です。VATを使用していないながらなかなか立体的な表現ができます。