タバコ煙のような細いボリュームの作成方法
ひさびさのHoudiniの記事です。
業務内でちょこちょこ出てくる、 タバコ煙や、糸を引くようなオーラなどの細いボリュームの作成方法について、自分へのメモがてら書いていこうと思います。
海外の頭の良い人がすでに紹介している方法なので、オリジナルではないですが。。。
日本語で、こちらを扱う際の解説が出来れば、と思います。
今回、最終的に出来上がるのは、下記のようなものになります。
・大まかな流れ
大まかな流れとしましては、
①ベースのラフ煙のPyroシミュレーション
②ベース煙のライン化
③ラインのボリューム化
となります。
上記画像は、すべて同じフレームの画像キャプチャです。
・ベースのラフ煙のPyroシミュレーション
エミッタの処理が長くなっていますが、基本的な処理を行っているだけでシンプルなPyroシミュレーションの構築を行っているだけで、特に変わったことは行っていません。
ラフ煙のプレビューは下記のように非常に軽い解像度の計算になっています。
・ベース煙のライン化
左側のノードの流れは、ベース煙のエミッタにもなっているポイントです。
この時点でのポイント数が、最終的なライン本数になるので、Scatterノードではそれを見越して設定します。
また、ライン化するために必要なIDもこの時点で割り振っています。
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の値を設定して、ボリュームのアトリビュートを調整しています。
ラインをボリューム化したプレビューは下記のようになります。
以上、タバコ煙や、糸を引くようなオーラなどの細いボリュームの作成方法になります。