すあまの備忘録

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

破壊(RBD)の流れメモ vol.5 POP Debris

Debris Sourceみたいな処理

やり方の一つとしてメモ。insideの外周からPOPをエミットさせる感じ。

ライン化してから処理しているが、精度を上げたり面からエミットしたい場合はvol.6の方法を応用して混ぜたり、ライン化せずinsideに大量にScatterして判定するのが良いと思う。

全体

f:id:godofsuama:20201026174601p:plain

ラインの作成

動いていないハイポリのエミットさせたい部分のinsideを取り出す。

f:id:godofsuama:20201026175041p:plain

for-each named primitive内でライン化処理をする

f:id:godofsuama:20201026175254p:plain

「Convert Line」でメッシュをライン上に変換。

f:id:godofsuama:20201026175411p:plain

元形状からGroup - Unshared Edgeで外周のエッジをグループにする。

f:id:godofsuama:20201026175647p:plain

外周グループと元アトリビュートをラインになっているものに転送し、

グループのみを残す。

f:id:godofsuama:20201026175812p:plain

f:id:godofsuama:20201026175929p:plain

アトリビュートの整理

不要なアトリビュート等を整理したり、nameをPointにPromoteしたりする。

キャッシュを取って、「Add」でポイント化する。Resampleを挟んでポイント数を増やしてもいいと思う。

f:id:godofsuama:20201026180348p:plain

f:id:godofsuama:20201026180437p:plain

エミッター処理
動かす

「Transform Pieces」で動かす。何度も出てきているが、

nameさえ一致すれば動くのでnameを維持し、

動かされる方は必ず時間依存しないキャッシュを作ると処理が遅くなりづらい。

f:id:godofsuama:20201026180655p:plain

Trailでvを再計算しておく。

速度で間引く

後でエミッター用に間引くために速度の遅い(動いていない)ものをグループに入れる。

f:id:godofsuama:20201026180847p:plain

vector vel = point(0, "v", @ptnum);

if(length(vel) < ch("threshold")) {
    i@group_move=1;
}
近接の名前で間引く

一定の距離内のポイントが自分と同じnameかどうかとrestから離れた距離で判定し、グループに入れる。

f:id:godofsuama:20201026181046p:plain

int npts[] = nearpoints(geoself(), @P, ch("maxDist"), ch("maxPt"));
int npt = 0;
string currentName = point(geoself(), "name", @ptnum);
vector currentPos = point(geoself(), "rest", @ptnum);

foreach(npt; npts) {
    string findName = point(geoself(), "name", npt);
    vector findPos = point(geoself(), "P", npt);
    float dist = distance(currentPos, findPos);
    if(currentName != findName && dist < ch("dist")) {
        i@checkCnt += 1;
    }
}

if(@checkCnt >= 1) {
    i@group_checkGp = 1;
}
グループ作成

↑2つで作ったグループから、速度が早く、近接に違うnameのものがいて、rest位置から一定の距離離れていないものでグループを作る。

Wrangleでできるグループが逆なので文字にするとややこしい。ざっくりいうと速く動いていて離れたピースのグループがほしい。

f:id:godofsuama:20201026181814p:plain

f:id:godofsuama:20201026181948g:plain

ageの作成

「SOP Solver」で、↑のグループに入ったもののみ毎フレームageにTimeIncを足す。

f:id:godofsuama:20201026182243p:plain

f:id:godofsuama:20201026182301p:plain

分離した瞬間だけエミットさせたいので、「Attribute Remap」でageを極端にRemapして、ageの低いときだけCdを1,1,1にする。

f:id:godofsuama:20201026182459p:plain

f:id:godofsuama:20201026182725g:plain

その後、Cdにランダムを足し、vにもランダム化をする。

f:id:godofsuama:20201026182707p:plain

多すぎるのでランダムにポイントを間引き、さらにCdの閾値でポイントを削除してエミッターとする。

f:id:godofsuama:20201026182909p:plain

POP

特殊なことはしていない。ハイポリを動かしたものをコリジョンに使用している。

f:id:godofsuama:20201026183105p:plain

最後にマテリアルや場合によってはCopy to Pointsで軽い形状をコピーして終了。

レンダリング精度が低いので見えづらいが結構な量を出している。

f:id:godofsuama:20201026183410g:plain