【UE5】PCGで道路同士の重なりを判定して、道路脇の柵メッシュを生成しないようにする

Pocket
LinkedIn にシェア
LINEで送る
reddit にシェア
このエントリーをはてなブックマークに追加

PCGの日本庭園作成中に出くわした問題です。解決方法の備忘録。
通路の両脇に生成する柵ですが、通路同士が交差するようにSplineを配置したとき、柵が出てきてしまって通れなくなってしまうんですよね。困った。

そこで、柵を配置する際に通路と干渉しているかをチェックして、柵を出さないようにする考慮の実装方法です。

やり方

前提として以下の条件の場合で説明します。
・Blueprint ClassにSplineとPCGのコンポーネントを持っていて、
・ワールドにBlueprintを配置して通路を設置する。

1.BlueprintにTagタグをセットしておく
これが一番簡単でしたので。
Blueprintの[Tags]に目印の文字列をセットしておきます。
今回は「BP_Road」という名前を付けておきました。

通路はすべて Tags = BP_Road をセットしておいてください。

2.PCG GraphでTagsを呼び出す
次にPCG Graphを開きましょう。
前提より、BlueprintにPCG Componentがあり、Instanceグループの[Graph]にはPCG Graphアセットがセットされています。
PCG Graphを開きましょう。

[Get Spline Data]スプラインデータを取得ノードを呼び出して、
  ・[アクタの選択]は[By Tag]にします。
  ・[アクタ選択タグ]は先ほどBlueprintにセットした[BP_Road]と入力します。

この状態で[Get Spline Data]ノードをデバッグしてみましょう。[A]キーを押します。
するとOutからワールドにタグ付きで設置した全ての通路のSplineが取得できました。結構簡単でしたね。

で、通路の数が多くなると処理数も多くなってしまうので、オプションで色々と簡略化ができます。
  自身のオーバーラップを必須にする: 自分自身と干渉するSplineだけ取得してくれます。基本はONにした方がいいです、めっちゃ軽くなります。ただしうまくいかないケースがあるのでその時はOFFに。
  複数選択: チェックすると全部取得できます。チェックOFFだと最初に見つかった1本だけ取得します。本使用法においては原則チェックONです。
  自己および子を無視: 自分自身を取得しない場合にチェックを入れます。なんかうまくいかないことが多くて私はOFFにしています。

スクショのBlueprintでは[自己および子を無視]しないので、[Get Spline Data]で自分自身のSplineを取得して、[Difference]ノードを使って自分のSplineを除去しています。

・・・という一連の処理を、私は[Get All Roads]というPCG Graphアセットにしています。便利です。

3.柵のメッシュと通路の干渉チェックをする
さていよいよ引き算をします。[Difference]ノードを使います。
柵のメッシュの配置点Pointsをinの[Source]につなぎ、[Get All Roads]のoutをinの[Differences]に接続。
すると道路と重なるPointsが除去されます。

画像だとちょっと通路内に柵が出ちゃっていますが、それは[Get All Roads]の中で道路の領域のBoundsを調整すればそれなりにうまくいくようになります。

4.Boundsの調整
3についてもう少し具体的に言うと[Get All Roads]で最後に[Bounds Modifier]というのをやっているのですが、「干渉チェックする箱のサイズ」を決めています。
可視化して説明すると、自分の柵のメッシュ(4-2)が、自分以外の通路の箱(4-1)と重なったものを除去する。ということを[Difference]ノードがやってくれています
4-1.これが通路としてのサイズの箱です。

4-2.これが柵のメッシュの配置点です。(実際には点です。)

4-3.これがDifferenceの結果です。(実際には点です。)

管理人が読んだおすすめの建築本

    

コメントを残す