[UE5] PCG Shape Grammarを触ってみた


この記事は、[Unreal Engine (UE) Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ue "Unreal Engine (UE) Advent Calendar 2024")  カレンダーシリーズ３の17日目の記事です。

# はじめに

Qiitaでは皆さまはじめまして。HiMiKo（ひみこ）といいます。
アドカレは今回が初参加です。
こういった記事の制作に不慣れなので、気になる点などありましたら
ご指摘いただけると嬉しいです。

UE5.5からの新機能であるPCG Shape Grammarは、PCGにおけるメッシュの生成ルールを専用の文法で記述し、生成順番や頻度を制御できるというものです。今回そちらを触ってみました。

開発環境は以下の通りです。
Unreal Engine：5.5.1
OS：Windows11Home

# PCG Shape Grammarとは
### PCG Shape Grammarの概要
UE5.2からプロシージャル コンテンツ生成 (PCG：Procedural Content Generation) フレームワークが追加され、木や草などのオブジェクトを大量にシーンに配置することが出来るようになりました。
UE5.5で追加された「PCG Shape Grammar」でルールを記述すると、特定のオブジェクトの生成頻度や、「この部分は常に固定だけど、この部分は動的に生成したい」などの指定が行いやすくなります。


### 使用例
例として、UE5.5のEngine内にあるサンプルプロジェクトを見てみます。
以下のディレクトリのGrammarSampleレベルで使用例が見られます。
```
\エンジンルート\Engine\Plugins\PCG Contents\SampleContent\Grammar
```

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/113b3ca0-b484-0e9d-41b1-29f7851a9961.png">

このフェンスの例だと、フェンス内に入るためのドア（緑色のモジュール）の両脇に柱のモジュール（青色のモジュール×２）があり、他はすべてフェンスのモジュール（赤色のモジュール）になっています。
入口部分は決まった順番でモジュール群を生成し、
それ以外はSplineの大きさに応じてフェンスモジュールを埋めるという造りです。

### 使い方の概要
#### 1.PCG Shape Grammarを使って、生成ルールを定義する
たとえば上記のフェンスの生成ルールであれば、以下のようになります。
```
[Fence]*[C]2[Door][C]2[Fence]* 
```
#### 2.文字列（シンボル）と、対応するメッシュをそれぞれ配列に格納
上記の生成ルールであれば、「Fence」「C」「Door」という文字列（シンボル）に対して、それぞれ割り当てるメッシュを配列に格納しておきます。

#### 3.定義した生成ルール、文字列（シンボル）、対応するメッシュに基づいてSplineを区切る
メッシュの境界情報からメッシュサイズやピボット位置を割り出すサブグラフを作成し、生成ルール、文字列（シンボル）、文字列（シンボル）に対応するメッシュの情報を取得して、それらを基にSplineを細分化します。

#### 4.生成ルールに沿ったメッシュの情報を引き出し、ピボット位置を調整しつつ静的メッシュを生成

各メッシュのピボットの位置・回転・拡縮を調整し、Splineに沿ったポイントへStatic Mesh Spawnerノードでメッシュを生成します。

# フェンスを作ってGrammarで遊んでみた

フェンスを作る手順はほぼドキュメントの通りですが（下記リンク参照）、
ドキュメントとは別のFabアセットを使用してみました。

#### ドキュメント：Creating a Fence Generator Using Shape Grammar
[Creating a Fence Generator Using Shape Grammar](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/creating-a-fence-generator-using-shape-grammar-in-unreal-engine) 

#### アセット (Fab)
[Quixel : Modular Saloon Trim and Rail](https://fab.com/s/afd4cad5f4e1)
[Quixel : Stained Wooden Swing Door](https://fab.com/s/404b62ea3625)
[Quixel : Modular Saloon Bar Kit](https://fab.com/s/2887f93c72bf)

### 完成図
#### BP_GramFence
![スクリーンショット 2024-12-05 165820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/997b40b0-c058-64f3-2d02-51cf5085be60.png)

#### PCGG_GramFence
![スクリーンショット 2024-12-05 170320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/22ad4a28-4695-46fb-b353-64d29cedb9af.png)

#### PCGG_ExtractInfo_GramFence
![スクリーンショット 2024-12-05 165659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/feccdb16-e6b5-703d-7f12-ffd8306155ac.png)

:::note info
PCGG_ExtractInfo_GramFenceはPCGG_GramFenceのサブグラフになります。
:::

### 実行結果
![スクリーンショット 2024-12-11 134921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/3bcc3d1d-ee35-6dcf-5dc1-14378d14b56f.png)

### Grammarいろいろいじってみた

このサンプルで作成したSplineは、
下記のようなポイントの配置になっています。

![スクリーンショット 2024-12-11 134437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/601f6975-0627-83f1-e3b0-b6f402dc7173.png)

PCGのShape Grammarはこのように記述しています。
```
[FA]*[DL,DR][FB]2
```
フェンスAのモジュール（FA）をできるだけ配置した後、
2つのドアモジュール（DL、DR）と2つのフェンスBモジュール（FB）を
配置するという内容です。

こちらを練習のために少し変えてみます。
PCG Shape GrammarのドキュメントにはGrammarの構文が
記載されているのでいくつか抜粋します。

:::note warn
2024年11月末現在、ドキュメントは日本語翻訳がされていないため、機械翻訳した内容を載せています。
:::

| Symbol | Rule |
|:---------|:-----------------------------------|
| [A, B]   |モジュールAとBの組み合わせを配置する   |
| [A, B]*  |モジュールAとBの組み合わせを、できるだけ多く配置する   |
| [A, B]+  |モジュールAとBの組み合わせを、1回配置した上、できるだけ多く配置する   |
| [A, B]2  |モジュールAとBの組み合わせを、2回配置する   |
| \<A, B, C>  | 十分なスペースがある場合はモジュールAを配置し、そうでない場合はモジュールBをまず配置し、さらにモジュールCを配置する |
| \{[A,B]:2,[B,C]:1}*  | 構文に示されている重み付け値を使用して、モジュールAとB、BとCの組み合わせをランダムに選択し、できるだけ多く配置する |


#### サンプル１
```
[FA,FB]*,[DL,DR], [FA,FB]*
```
![スクリーンショット 2024-12-11 142802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/4bacd610-1ad2-7d75-15f7-11dbb5fd2364.png)

中心に2つのドアモジュール、端はAとBの組み合わせを出来るだけ配置。
最後に隙間ができてしまっていますが、これはモジュール1つ分しか
スペースに空きがなかったから。
Splineの端は複数モジュールの組み合わせではなく、
単体モジュールで埋めた方がよさそうです。

#### サンプル２
```
{[FA]:3,[FB]:1}*,[DL,DR], {[FA]:1,[FB]:2}*
```


![スクリーンショット 2024-12-11 140928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/7f89eabd-42d6-6aeb-7f1c-22ec00db3425.png)

2つのドアモジュールの手前はAが多め、背後はBが多めに
なっているのが分かりやすい例。

#### サンプル３
```
{[FA]:2,[FB]:3,[FA,DL,DR,FA]+}*
```
![スクリーンショット 2024-12-11 151042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939418/cf06b046-962d-7ee8-3266-d8ca3b23f974.png)

フェンスA、2つのドア、フェンスAという組み合わせを1つ以上配置し、
フェンスAとフェンスBを重みづけに従って配置。
たとえばダンジョンの生成などで、「部屋に1つ以上は出入口が必要」と
いうような場合に使えるかも？と思いました。


# 終わりに
Shape Grammarの記述方法はまだまだ変更されていきそうな感じがします。
個人的には、各メッシュ生成の重みづけが一目で分かりやすい＆調整しやすくて
使いやすい印象でした！


# 追記(12/16)
書き終わったあたりで、UE5.5のPCG最新機能をたくさん使用している
Cassini Sample Projectがダウンロードできるようになりました！
##### [The Cassini Sample Project is now available](https://www.unrealengine.com/en-US/news/the-cassini-sample-project-is-now-available)
この記事で扱っているPCG Shape Grammarも使われていますので
ご興味のある方はぜひチェックしてみてください。
上記のリンク内にもありますが、サンプルプロジェクトの内容を確認するには
Unreal Fest Seattle 2024の下記の動画に沿って行うと造りが分かりやすいです。
##### [PCG: Advanced Topics & New Features in UE 5.5 | Unreal Fest 2024](https://youtu.be/j3ke6MmcaeY?si=4a7V0dxxuZrDhipP)

~~サンプルプロジェクトの中身確認は記事公開日に間に合わず…そのうちどこかでまとめるかも~~

# 参考資料
#### Unreal Engine 5.5 Document
##### [プロシージャル コンテンツ生成の概要](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/procedural-content-generation-overview)
##### [Using Shape Grammar With PCG](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/using-shape-grammar-with-pcg-in-unreal-engine)
##### [Creating a Fence Generator Using Shape Grammar](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/creating-a-fence-generator-using-shape-grammar-in-unreal-engine)

今回の記事で参照した作成手順等です。

#### Unreal Engine 5で極める！プロシージャル技術(UE5 Deep Dive 2023)
https://www.docswell.com/s/EpicGamesJapan/ZQ8QY7-2023-12-22-105649#p94

前半にはプロシージャル生成自体が初めての方向けの説明が。
Houdiniを触ったことがなかったので、「ポイント」「ボリューム」「アトリビュート」など
基礎用語からまとめてくださっていて助かりました。

#### A Tech Artists Guide to PCG（テクニカルアーティスト向けのPCGガイド）
https://dev.epicgames.com/community/learning/knowledge-base/KP2D/unreal-engine-a-tech-artists-guide-to-pcg

2024年9月に来日してPCGのセミナーをしてくださった、Chris Murphy氏による最新ガイド。
Qiitaを見ている方にはこのガイドの方がより分かりやすいかもしれません。
PCGに何ができるのか、ノードの構造の基礎、パフォーマンスなどの
テクニカルな考慮事項に焦点を当てています。
5.5の最新機能まで含めて、PCGを大まかにつかみたい方はおすすめです。


#### [The Cassini Sample Project is now available](https://www.unrealengine.com/en-US/news/the-cassini-sample-project-is-now-available)

内容については「追記」の項をご確認ください。