タバコ煙のような細いボリュームの作成方法

ひさびさのHoudiniの記事です。

業務内でちょこちょこ出てくる、 タバコ煙や、糸を引くようなオーラなどの細いボリュームの作成方法について、自分へのメモがてら書いていこうと思います。

海外の頭の良い人がすでに紹介している方法なので、オリジナルではないですが。。。
日本語で、こちらを扱う際の解説が出来れば、と思います。

今回、最終的に出来上がるのは、下記のようなものになります。



・大まかな流れ

大まかな流れとしましては、

①ベースのラフ煙のPyroシミュレーション

ベースのラフ煙

②ベース煙のライン化

ベース煙のライン化

③ラインのボリューム化

ラインのボリューム化


となります。
上記画像は、すべて同じフレームの画像キャプチャです。


・ベースのラフ煙のPyroシミュレーション

ラフ煙のネットワークビュー

エミッタの処理が長くなっていますが、基本的な処理を行っているだけでシンプルなPyroシミュレーションの構築を行っているだけで、特に変わったことは行っていません。

ラフ煙のプレビューは下記のように非常に軽い解像度の計算になっています。

ラフ煙 プレビュー






・ベース煙のライン化

ベース煙のライン化ネットワークビュー

左側のノードの流れは、ベース煙のエミッタにもなっているポイントです。
この時点でのポイント数が、最終的なライン本数になるので、Scatterノードではそれを見越して設定します。
また、ライン化するために必要なIDもこの時点で割り振っています。

SopSolver内ネットワークビュー

VDB Advect Pointsノードで、「Input_2」から読み込んでいるボリュームのVelocityを使用してポイントを動かしています。
赤くなっているWrangleノードでは、ポイントが梯子のような縞々な発生にならないようにエミッタのPositionを調整しています。

vector vel=volumesamplev(@OpInput2,"vel",v@P);
v@P+=float(random(i@ptnum*3.432))*normalize(vel)*0.0005;

ライン化した際のスピードの調整は、上記のWrangle、VDB Advect PointsのTimestepパラメータの調整で行います。

Mergeノード後のWrangleでは、ageの設定や、ageによるPointの消去を行っています。

f@age+=@TimeInc;
if(@age>5){
    removepoint(geoself(),@ptnum);
    }
    

ベース煙をライン化したプレビューは下記になります。

ボリュームのライン化 プレビュー


・ラインのボリューム化

ラインのボリューム化のネットワークビュー

VDBノードのVoxel Sizeパラメータ、Wrangleでpscale,density,Cdの値を設定して、ボリュームのアトリビュートを調整しています。

ラインをボリューム化したプレビューは下記のようになります。

ラインをボリューム化したプレビュー

以上、タバコ煙や、糸を引くようなオーラなどの細いボリュームの作成方法になります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です