すあまの備忘録

誰得内容の自分のための非営利目的備忘録ブログ(筆者がわかっても内緒にしてください)

破壊(RBD)の流れメモ vol.4 Force Volume

RBDを壊す際に使用しているForce(Velocity Volume)の作り方。

ちょっとエラーや不具合があるのでそのまま使用するのは注意がいるのとWrangle多め。

以下のようなPoint VelocityからVelocity Volumeを作成しています。

f:id:godofsuama:20201025215226g:plain

全体

f:id:godofsuama:20201025215401p:plain

向かって左側はただのプレビュー用でなくても動くので説明端折ります。

位置と爆発フレームの指定

f:id:godofsuama:20201025215524p:plain

Point Generateで作成した1ポイントに対して、Transformで位置の調整をし、

impactFrameという爆発するフレーム番号をアトリビュートに入れます。

H18.5の「Pyro Burst Source」などのstartframeと同じイメージです。

f:id:godofsuama:20201025215557p:plain

Transformの回転の影響もうけれるように組めばよかったなと後悔してます。

回転で向きが変わらないので手打ちでベースのvをちょっとランダムにして設定します。

f:id:godofsuama:20201025220009p:plain

f:id:godofsuama:20201025220048p:plain

pscaleもとりあえず1に設定します。

Pointの複製

Point Replicateで各500くらい複製し、元のポイントの位置、とアトリビュートを引き継がせます。

Velocity Volumeにする際に隙間ができないようにするためです。

f:id:godofsuama:20201025220159p:plain

restを取ります。

Velocityの作成

調整できるアトリビュートはこんな感じ。

f:id:godofsuama:20201025220401p:plain

f:id:godofsuama:20201101013518p:plain

エラーがありますが、広がる角度やVelocityが0になるまでのフレーム数、広がる範囲等が変更できます。

f:id:godofsuama:20201025221007g:plain
広がる角度を調整したもの。1点変なのはエラー。

f:id:godofsuama:20201025221035g:plain
広がる範囲を広げたもの

f:id:godofsuama:20201025221205g:plain
減衰し切るまでの時間を伸ばしたもの

//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をちょっとランダムにしている。

f:id:godofsuama:20201025221922p:plain

VelocityとSDF Volumeの作成

Volume Rasterize AttributesでvをVolumeに変換

f:id:godofsuama:20201025222026p:plain

VDB from ParticleでPointからSDFを作成

このSDFはvol.3のSOP Solver内で使用していた、Glueを消すための範囲を指定するSDFになる。

f:id:godofsuama:20201025222114p:plain

f:id:godofsuama:20201025222128p:plain