自分のためのPOPメモ
設定
SOPでエミッターを詰める
必要なアトリビュートもSOPで作り、Pointのみの状態にして可能な限りCacheを取る。
Cacheを撮った場合はRetimeの処理も入れる。入れれないときもあるけど。
Velocity
Lifeを長くとり、初期Velocityを決めていい感じになるまで試す。POP ForceでGravityだけは足す。
その後Velocityにランダムを加えたのち、POP Dragを入れる。
最後にLifeを実際ほしい長さに調整してからPOP Forceのノイズ等を加える。
このあとUse VEXpression等を使い始める。
各工程にすぐ戻れるようにしておく。POP Force(Gravity)とPOP Force(Noise)を分けたりとか。
Jitter
すごい人の記事があるので…
火星防衛戦線:マンガ Houdini チュートリアル ーーエミッター補間ーー
Force
POP Force
GravityはPOP ForceのForceのYを-9.8とかで代用できる。

それ以外にも動きにノイズかけるときにも使う。
頻繁に使う理由はこのUse VEXpressionのチェック。

表に出ているパラメーターをすべてコントロールできる。
コントロールしたいパラメーターのアトリビュート名?的なのはパラメーター名の上にカーソル持っていくと出てくる。
Paramter:ampとかってやつ。
ageに依存してRamp使ってAmplitudeを変えたり、SOP上で作ったアトリビュートで何かしら処理を変えたり…と行ったことが手軽にできる。
このUse VEXpressionは他のPOP 〜〜系にもある。
POP Advect by Volume
PyroでシムしたVolumeのVelを読み込んできてPOPを動かす。という使い方が主。
ただ別にPyroじゃなくてもVolumeなら問題ない。
例えば、画像のようなカーブを作成し

Volume Velocity from Curveでvel Volumeにする。


なんかこういうのとか。

POP Curve Force
こちらの方のを参考に改変。
自分メモ)ちょっと改変して以下のように
Curveまでの距離でSuctionをMultiplyする処理とかいれた。

int hitprim;
vector hituv;
//culc
float dist = xyzdist(1, @P, hitprim, hituv);
float distRange = fit(dist, chf("srcDistx"), chf("srcDisty"), 0, 1);
float distRamp = chramp("Dist_Ramp", distRange);
distRamp = fit(distRamp, 0, 1, chf("distMultx"), chf("distMulty"));
vector dir = primuv(1, "N", hitprim, hituv);
vector pos = primuv(1, "P", hitprim, hituv);
vector suction = (@P - pos) * (chf("Suction_Mult") * distRamp);
dir *= chf("Dir_Speed");
//add force
v@force += (suction + dir) *-1;
//delete by cureveu
if(hituv.x >= 1) {
f@age = @life;
};
Property

POPのDragとかFrictionとか諸々のアトリビュートを設定できる。なんといってもUse VEXpressionが使える!つまり条件をつけていろいろ設定できるということ。
SOPで初期値を設定してDOP内で変更したい場合等。
POP Objectにはないものも設定できるので覚えておくとたまに便利。
Collision
基本的にSDF Volumeにする。
キャッシュを取らないと重いので、下記画像のようにPolygonとSDF別々にGroupを作ってからMergeしてキャッシュを取る。

DOP内では下記画像のようにつなぐ。Static SolverはなくてもOK。

設定は以下の感じ。
Use Deforming Geometryは動いていなければオフでOK
Laser ScanもSOPでSDFを作っていたら効果はなかったはず。

POP ObjectのPhysicsにあるBounce Forwardをほんの少し下げると摩擦?で停止するようになる。



回転
DOP
大抵の場合POPの回転は後処理でやるほうが良いとは思うが、どうしても中でやりたいときメモ

POP Wrangleで以下を記述
//rot speed
float speed = length(v@v);
f@rotAngle += speed;
float angle = @rotAngle * chf("mult");
//set random Dir
vector normV = normalize(@v);
vector rndDir = set(rand(@id), rand(@id+5), rand(@id*2));
vector normDir = normalize(rndDir);
vector axis = cross(normDir, normV);
//set orient
vector4 quat = quaternion(angle,axis);
p@orient = quat;
記述するとMultパラメーターができるのでそれでMultiplyする。
SOP
上記仕組みは簡単な手直しでSOP上でも使える。

Point Wrangle等で以下を記述
//rot speed
f@rotAngle += @Time;
float angle = @rotAngle * chf("mult");
//set random Dir
vector axis = normalize(@N);
//set orient
vector4 quat = quaternion(angle,axis);
p@orient = quat;
ようするに1つのVector Attributeと毎フレーム増加する値があればいい。
上の例ではNで回転方向を決め、@Timeを使って時間が進むほど回転するようにしている。
(この際Point Velocityでvを作ると初期設定で毎フレームアニメーションするvができるので、毎フレーム回転方向がめちゃくちゃになる。AnimatedをオフにすればOK)
POP Torque
POP Torqueもほぼ同じで、axisをSOPのアトリビュートとかrandomで作ればいい感じに乱れる。
POP TorqueでUse VEXpressionを使用しないと1方向に等速回転になるが、POP Wrangleでやっていることが分かっていれば何を変えればいいかなんとなくわかるようになる。

おまけ
Gas Intermittent Solve

POPよりかはRBDとかでよく使う。

Only Once Per Timestepにチェックを入れると、Substepを増やしてもこのノードの上流は1度しか計算しない。
何かしらのintアトリビュートの加算計算等をしてSubstepを増やすと、増やした分だけたされてしまったりするのでそれを回避するのに使っている。
出番は多くはないけどあると便利なときもある系