RBDを壊す際に使用しているForce(Velocity Volume)の作り方。
ちょっとエラーや不具合があるのでそのまま使用するのは注意がいるのとWrangle多め。
以下のようなPoint VelocityからVelocity Volumeを作成しています。
全体
向かって左側はただのプレビュー用でなくても動くので説明端折ります。
位置と爆発フレームの指定
Point Generateで作成した1ポイントに対して、Transformで位置の調整をし、
impactFrame
という爆発するフレーム番号をアトリビュートに入れます。
H18.5の「Pyro Burst Source」などのstartframe
と同じイメージです。
Transformの回転の影響もうけれるように組めばよかったなと後悔してます。
回転で向きが変わらないので手打ちでベースのvをちょっとランダムにして設定します。
pscale
もとりあえず1に設定します。
Pointの複製
Point Replicateで各500くらい複製し、元のポイントの位置、とアトリビュートを引き継がせます。
Velocity Volumeにする際に隙間ができないようにするためです。
rest
を取ります。
Velocityの作成
調整できるアトリビュートはこんな感じ。
エラーがありますが、広がる角度やVelocityが0になるまでのフレーム数、広がる範囲等が変更できます。
//sample cone float rad = radians(chf("angle") /2); v@v = sample_sphere_cone(@v, rad, rand(@ptnum)); float impactRamp = 0; //kill point if(@Frame < @impactFrame - ch("durx") || @Frame > @impactFrame + ch("dury")) { removepoint(geoself(), @ptnum); } //move P if(@Frame < @impactFrame) { impactRamp = fit(@Frame, @impactFrame - ch("durx"), @impactFrame, 0, 1); float impactMult = fit01(impactRamp, 0, ch("impScalex")); v@P += v@v * impactMult; }else{ impactRamp = fit(@Frame, @impactFrame, @impactFrame + ch("dury"), 0, 1); float impactMult = fit01(impactRamp, ch("impScalex"), ch("impScaley")); v@P += v@v * impactMult; } v@v = normalize(@P - @rest); //dist mult float dist = fit(distance(@rest, @P), ch("rangex"), ch("rangey"), 0, 1); float distRamp = chramp("mult_ramp", dist); float distMult = fit01(distRamp, ch("multx"), ch("multy")); float multRamp = chramp("impactMult", (impactRamp)); v@v = v@v * distMult * multRamp;
sample_cone部分でsample_sphere_cone
を使用してコーン上に広がるvを作成。これだけで360度のスフィア形状までカバーできる。
kill point、move Pで、impactFrameとDurationを使用してPointの削除とv全体のMultiplyをしている。
dist mult部分で広がる距離に応じたvのMultiplyをしている。
このWrangleのあと、Attribute Randomizeでvをちょっとランダムにしている。
VelocityとSDF Volumeの作成
Volume Rasterize AttributesでvをVolumeに変換
VDB from ParticleでPointからSDFを作成
このSDFはvol.3のSOP Solver内で使用していた、Glueを消すための範囲を指定するSDFになる。