Houdiniで植物アセットの成長アニメーションをプロシージャルに作る
#Houdini #tips #SOP
参考:https://youtu.be/9bsb-WBGPTc?si=hWmKFAHiwqvDpQFq]
アセットをプロシージャルに成長させるためのフロー
前提として、このフローが取れるのはあくまで中~遠景用の花のみ。アセットから直接スケルトンを生成しkinefxで動かすので、近景だと粗さが目立つ。大人しく花びらから作ってください。
おおまかにいくと
1. ジオメトリをまんべんなく覆うようにscatterでポイントを散布。
2. Connect Adjacent Piecesで近くにあるポイントどうしを繋いでポリゴンを作る。
3. fuseでポイントをある程度マージ
4. find shortest pathでスケルトン作成。
5. edge transportでrootからどれくらいポイントが離れているか計算。
6.パーツごとにindexを分ける。
めちゃくちゃだいたいでよい。
7. @indexをもとにランダムな値を生成し、デュレーションに応じて線形補完後@maskを生成。
code:lerp
@blend=rand(@index);
@progress=lerp(@progress,@opinput1_progress,@blend);
float width = chf("width");
@mask=fit(@distance,0,detail(0,"MAXdist"),width,1);
@mask=fit(@mask,@progress,@progress+width,0,1);
// @progressはキーフレームを打って制御するパラメーター。どれくらい育っているかを指定する。
// widthは成長が進行していく範囲を指定するパラメーター
// maxdistは@distanceの最大値。promoteなどでdetail attributeとして保存しておく。
8. @maskをもとにkinefxで回す、お好みでrescale。
code:kinefxrotate
float angle = chf("angle");
vector axis =chv("axis");
float fade = chramp("fade",fit(@distance, 0, detail(0, "maxDist"), 0, 1));
float mask=chramp("mask",@mask);
angle*=fade*mask;
prerotate(4@localtransform,angle,axis);
取得しておいたditanceの最長からfit、@maskとともにangleにかけて、最後にprerotate、rigにorient along curveで3*3transformをつけておく必要がある。
動画のやり方と違うが、軸指定できるのでこっちの方がいいと思われる
9.bone caputure proximityでジオメトリとスケルトンをバインド
10.bone deformで動かす
ポイントになるのは2と9
これはアセットごとに最良の設定を探す必要がある。
スケルトンがどれくらい詳細なものか、そしてウェイトをどの範囲でつけるかこれによってきれいさが段違いになってくる
https://scrapbox.io/files/67e6950a396e84313b082359.png
基本的にbone caputure proximityではmax influenceは小さめの値にしてdropoffは状況に応じて使い分ける感じが吉。(どれだけ精細なアセットかにもよるが...)
問題はconnect adjacent pieces
https://scrapbox.io/files/67e6957c7a55364a5456ed90.png
search radiusはどれくらいの範囲をマージするかでsearch pointsはどのくらいの数のポイントをマージするか、重要なのは後者で、スケルトンの解像度が変わってくる。これが大きすぎても小さすぎてもいけないので、元のアセットのジオメトリと比較しながらディティールを拾えるぎりぎりくらいの解像度で止めるべき。