scatterなどで複製時にメッシュに近いオブジェクトを外側に反らす
フォリッジに利用する目的で草等のscatterで配置したオブジェクトが物体を避ける方向に曲がるような仕組みを作りたい

環境
HoudiniIndie20.5.487
目的
foliageなどのpointに対して作成したメッシュが重なってしまう状態
foliageをHoudiniEngineのpointベースで作成するとして、最近接のメッシュとほぼ重なってしまうような状態になった際配置物がわずかに反対方向に曲がるような表現がしたい

実行結果
今回の構成の実行結果
パラメータの値と距離によって反対方向にorientをつけている

ノード構成
入力ノード
scatter point、判定用のメッシュ
入力一つ目はHeightFieldScatterで作成したHeightField上のpoint

入力二つ目は近接判定したいメッシュ

処理ノード
二つのwrangleで処理をしていく
一つ目のpoint wrangleは第1入力にscatterpoint、第2入力に判定用のメッシュを入力した。
minpos(最近接座標を取得)を使う以下のvexを設定し、pointごとの判定メッシュとの最近接点、最近接点との距離、最近接点への方向を取得する。
v@closet_pos = minpos(1,@P);
f@closet_dist = distance(@P, @closet_pos);
v@closet_dir = normalize(@closet_pos - @P);
二つ目のVEXで取得したこれらの値を利用して回転値をorientに反映した。
最近接点との距離に応じて回転量を減少するようにしている。
matrix3 rot_matrix = qconvert(@orient);
float dir_x = v@closet_dir[0];
float dir_z = v@closet_dir[2];
float distance_intensity = min(chf("max_distance") / @closet_dist, 1);
float z_angle = -radians(90 * chf("intensity") * dir_x * distance_intensity);
float x_angle = radians(90 * chf("intensity") * dir_z * distance_intensity);
matrix3 rot_z = set(
cos(z_angle), -sin(z_angle), 0,
sin(z_angle), cos(z_angle), 0,
0, 0, 1
);
matrix3 rot_x = set(
1, 0, 0,
0, cos(x_angle), -sin(x_angle),
0, sin(x_angle), cos(x_angle)
);
rot_matrix = rot_matrix * rot_x * rot_z;
@orient = quaternion(rot_matrix);
orientはscatter段階でランダムなorientをかけていても一応動作できる。
曲がりすぎてしまうケースも考えられるのでブレンド方法は再検討したほうがよいかも


やりたいことできたと思う。
計算周りはしっかり検証できてないので実用レベルを目指すにあたり動作検証とブラッシュアップはしたい。
こういった、「他のオブジェクトとの影響量をfoliageのpointに反映」などはHoudiniが手作業より優位に配置可能な手段だと感じる。
(というか手作業だと無理と断じて良いでしょう)
foliageで回転値とか本当に調整しづらいのでその最たる例ではないかな。

fish_ball
プロシージャル魚類