【UE5】PCGで平坦な場所だけを抽出&密集しすぎたポイントを間引く方法
Unreal Engine 5のPCG(Procedural Content Generation)を使用していて、「平らな場所だけにオブジェクトを配置したい」「ポイント同士が近すぎるから間引きたい」という場面に直面した際の解決方法をまとめました。
1. 平坦な場所だけをピックアップする
地形(Landscapeなど)の中から、傾斜のない平坦な場所だけを抽出するには、地面の法線(Normal)を元にフィルタリングするのが一番簡単です。
使用するノード
- Surface Sampler (またはその他のサンプラー)
- Normal To Density
- Density Filter
手順
- サンプラーでポイントを生成した後、
Normal To Densityノードを繋ぎます。- このノードは、ポイントが真上を向いている(平らである)ほど Density(密度)を
1.0に、傾斜がきついほど0に近づけてくれます。デフォルト設定でOKです。
- このノードは、ポイントが真上を向いている(平らである)ほど Density(密度)を
- 次に
Density Filterノードを繋ぎます。 - 詳細パネルで以下のように設定します。
-
Lower Bound:
0.85〜0.95(1に近づけるほど「完全な平坦」のみになります) -
Upper Bound:
1.0
-
Lower Bound:
これだけで、指定した平坦さのポイントのみが残ります。ノードを選択して D キーを押してデバッグ表示しながら、Lower Boundの数値を調整してみてください。
2. 罠:Densityが1なのにActorが斜めに配置されてしまう場合
フィルタリングを通過したポイントはデータ上(RollやPitch)は間違いなく水平(0度)になっています。それなのに最終的にスポーンしたActorが傾いている場合、以下の原因が考えられます。
原因と解決策:Projectionノードの順番
一番ありがちなのが、Density Filter で平らなポイントを抽出した 後 に Projection ノード(地形に沿わせる処理)を行っているケースです。
これだと、せっかく平らなポイントを選別したのに、後から地形の傾きに合わせてポイントが回転してしまいます。
👉 解決策:
Projection ノードを Normal To Density の前 に配置してください。
「ポイントを地形に投影して傾きを取得する」→「傾きを元に平らな場所を判定する」という順番にすることで解決します。
※スプライン等を元にポイントを生成している場合も、スプライン自体の回転を拾っている可能性があるため、同様にProjectionを先に挟んでLandscapeの法線を正しく取得するようにします。
3. Transform等で移動したポイントを一定距離で間引く
ポイントを Transform Points などでランダムに移動させた結果、ポイント同士が近くなりすぎてしまった場合、Self Pruning ノードを使って間引くことができます。
使用するノード
- Bounds Modifier
- Self Pruning
手順
Self Pruning は「ポイントの Bounds(境界ボックス)が重なっている場合に、一方を削除する」という挙動をします。そのため、まずは間引きたい距離に合わせて Bounds を設定します。
- 間引きたい処理の直前に
Bounds Modifierノードを繋ぎます。 - 詳細パネルで以下のように設定します。
-
Bounds Mode:
Set(既存のBoundsを上書き) -
Bounds Min:
(-100, -100, -100) -
Bounds Max:
(100, 100, 100)
(※この場合、半径100の範囲内に他のポイントがあれば重なる判定になります。必要な間隔に合わせて数値を調整してください)
-
Bounds Mode:
- その後に
Self Pruningノードを繋ぎます。- これで Bounds が重なっているポイントが自動的に間引かれます。
💡 Bounds設定時のコツ
元のデータ(特にスプライン等から生成したポイント)は、Boundsが X: -500 ~ 500 のように細長い線状になっていることがあります。そのまま Self Pruning をかけると「X方向には遠くないと消えないが、Y方向には少しでも近いと消える」という偏った間引きになってしまいます。
そのため、Bounds Modifierの Mode を Set にして、X, Y, Zを均等な立方体サイズで上書きするのが綺麗に間引くコツです。
間引いた後にActorのサイズ感がおかしくなる場合は、Self Pruning の後にもう一度 Bounds Modifier を繋いで、Boundsを元のサイズや適切なサイズに戻してあげてください。
環境
- Unreal Engine 5

