HOME

scatterなどで複製時にメッシュに近いオブジェクトを外側に反らす

フォリッジに利用する目的で草等のscatterで配置したオブジェクトが物体を避ける方向に曲がるような仕組みを作りたい

環境

HoudiniIndie20.5.487

目的

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

配置物と重なってしまうfoliageのイメージ

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

foliageが近接メッシュを避けるイメージ(実行結果)

ノード構成

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

orient設定対象となる、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をかけていても一応動作できる。
曲がりすぎてしまうケースも考えられるのでブレンド方法は再検討したほうがよいかも

orient量を変更
影響範囲の距離を変更

やりたいことできたと思う。
計算周りはしっかり検証できてないので実用レベルを目指すにあたり動作検証とブラッシュアップはしたい。


こういった、「他のオブジェクトとの影響量をfoliageのpointに反映」などはHoudiniが手作業より優位に配置可能な手段だと感じる。
(というか手作業だと無理と断じて良いでしょう)
foliageで回転値とか本当に調整しづらいのでその最たる例ではないかな。

fish_ball

プロシージャル魚類