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になる。

