すあまの備忘録

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

Particle Along Surface (SOPのみ)

前々からSOPのみでParticle Along Surfaceの処理を作っていたところ、以下のツイートを参考に簡略化できそうだったのでまとめてみた

hipncファイルはこちら (Houdini Apprentice 18.0.287)

完成するとこんな感じ

f:id:godofsuama:20191230182141g:plain


Particle Along Surface (SOPのみ)

手順

1.GridをXYZ3軸が0-1空間内に収まるように作る
2.Velocityを設定する
3.ScatterでPointを散布する
4.idを作成する (サンプルではEnumrateを使用)
5.以下のWrangleでPointを動かす
@P += @v * @Time;
@P %= 1;
6.Trail, Add(by id), Resampleで適切なポイント数のラインを作成する
7.Measureで各ラインの長さを測り、Attribute Promoteで平均の長さをDetailへ格納する
8.Deleteと以下のExpressionで平均以上の長さのラインを削除する
@perimeter>detail(0, "aveMeter", 0)

こうすることで、手順5の処理により1frameで一気に移動してしまったポイントを削除できる

9.Input0にPointを、Input1に這わせたいGeometryを接続し以下のWrangleを記述する

Input1にはUVが必須 (UVの向きにPointが流れる)ので注意

//Particle Along Surface(Poly)
vector uv = @P;
vector input1_N = uvsample(1,"N","uv",uv);
vector input1_P = uvsample(1,"P","uv",uv);

@P = input1_P + input1_N * @P.z;
@N = uvsample(1,"N","uv",uv);
@uv = uvsample(1,"uv","uv",uv);
10.pscale, Cd, Nなどを必要に応じて設定する

手順6の際のResampleでcurveuを設定してその後のAttribute Remapでcurveuを元にpscaleを作成し、

PolywireのWire Radius @pscale を設定しています。