前々からSOPのみでParticle Along Surfaceの処理を作っていたところ、以下のツイートを参考に簡略化できそうだったのでまとめてみた
hipncファイルはこちら (Houdini Apprentice 18.0.287)
こういうのもSOPだけでできる。大切なのはアトリビュートとはどういうもので、それを使ってジオメトリをどう動かすか。どうコントロールするかを早くから学ぶことだ。
— ホワイトめんたいこ (@kickbase) December 16, 2019
ちなみにやってることは簡単でAttribute randomizeでvアトリビュートつけてWrangleで動かしてるだけ。 pic.twitter.com/8rQ1gyKvzd
完成するとこんな感じ
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を作成し、