電通総研 テックブログ

電通総研が運営する技術ブログ

UE5のPCGを使ってフォトリアルな森を生成する

こんにちは、ISID 金融ソリューション事業部の岡崎です。
今回はUE5.2の新機能であるプロシージャルコンテンツ生成フレームワーク(PCG:Procedural Content Generation Framework)の紹介を行います。

はじめに

PCGとはコンテンツ生成に関するルールを作成し、そのルールに沿って植物や岩などのアセットを大量に配置できる機能です。
アセットの種類や位置、大きさなどを指示するルールを作成することで制作時間を大幅に削減でき、
ルールを流用することで大規模なワールド作成なども行えます。
また、変更に対して柔軟に対応しやすいという点もメリットになります。
今回はGaeaという3D地形生成ツールを使用してランドスケープを作成しながら、PCGを使用してフォトリアルな森の作り方を説明します。

検証環境/ツール

実装手順

  1. Gaea上でランドスケープを作成
  2. ハイトマップをUE5プロジェクトにインポート
  3. PCGを使用して森を生成

1. Gaea上でランドスケープを作成

まずはUE上でPCGを使用する前に、木々を生やすための土地(ランドスケープ)を作成します。
UEにもランドスケープを造形するツールは搭載しているのですが、今回はGaeaという3D地形生成を使用してランドスケープを生成します。

こちらの記事でUEのランドスケープ機能を紹介しているので、ぜひこちらもご覧ください。

まずはGaeaをインストールします。

解像度が1024x1024までは無料で使うことができるので、今回は無料版を使用します。

Gaeaを開くと下記のような画面になります。

左のタブの「Geo Primitives」から使用したい地形のモデルをドラッグ&ドロップします。

また、いくつかの地形モデルを組み合わせることもできます。
下の図では「Range(山岳)」と「Rocky(岩肌)」のノードを「Combine」を使用して組み合わせてみました。
「Range(山岳)」

「Rocky(岩肌)」

組み合わせた地形

今回のランドスケープでは、もう少し平地の部分も欲しかったので、
「Range」と「Worselands」の地形ノードを組み合わせて使用しました。

また組み合わせた地形に「FractalTerraces(地層)」のノードや「Erosion(浸食)」のノードを組み合わせ、
よりイメージに近い地形を作成しました。

詳しい地形ノードや効果のノードに関してはこちらの公式リファレンスを参照しました。

次にこれまで作成した地形をUEで使用するためにエクスポート作業を行います。
最終的に作成した「Erosion(浸食)」のノードを右クリックし、Renameを行います。
今回私は「MyWorld」という名前に変更しました。

続いて「MyWorld」を再度右クリックし、Mark for Exportを押下します。

右側のタブにエクスポートの詳細が表示されるので、出力形式を「.png」に変更します。

また、UEで推奨しているランドスケープの解像度の値は1009なので、「Resolution」を「1009」に変更します。

GaeaからUEにデータを移行する際、縦横の比率の変更をする必要があります。
右側の詳細画面のタブを「MyWorld Properties」に切り替え、地形の縦横・高低比率を調査するための「Lv」のボタンを押下します。

すると下記画面のように作成した地形の縦横比率が変わった状態のサンプルが表示されます。

デフォルトのままエクスポートをすると、この状態の地形がUEに入ってしまうので設定を変えていきます。
「Lv」の下にある「Clmp」ボタンを押下し、「Clmp Max」の値を「25%」に変更します。
(この値は作成したランドスケープを見ながら適宜調整します)

これで元のモデルと同じ縦横比率になるので、このままBuildタブに戻り、「Start Build」を行いファイルを出力します。

続いて出力したファイルをUEにインポートします。

2. ハイトマップをUE5プロジェクトにインポート

UEを開き選択モードからランドスケープモードに変更します。

新しいランドスケープのタブから、「ファイルからインポート」を選択します。

先ほどGaeaでエクスポートした「.png」ファイルを選択します。

インポート設定画面で、解像度をGaeaで設定した「1009x1009」に変更してインポートします。

インポート後、ランドスケープが出現していないように見えますが、「ExponentalHeight」が画面にモヤをかけてしまっており、遠くのランドスケープが見えなくなっているだけなので、
選択モードに変更後、上下の位置を変えることでランドスケープが見えるようになります。

これでGaeaで作成したランドスケープをUE上で使うことができます。

続いて作成したランドスケープにPCGで森を作成します。

3. PCGを使用して森を生成

まずPCGで森を作成する前に、作成されたランドスケープのマテリアルがデフォルトのままで味気ないので、マテリアルを割り当てます。
今回は簡易的に行うため、アウトライナーランドスケープを選択し、ランドスケープマテリアルに任意のマテリアルを選択しました。


次にPCGを使用するためにプラグインの設定をする必要があります。
プラグイン設定画面から「Procedural Content Generation Framework」をオンにします。UEを再起動させて設定を反映させます。

次に今回フォトリアルな森を作成するために使用するアセットのダウンロードを行います。

Unrealマーケットプレイスから「Megascans Trees(早期アクセス)」を開きダウンロードします。
今回はヨーロッパ風の木を使用しましたが、他に何種類かあったので自分の作りたいイメージに合ったものをダウンロードします。

ダウンロードが完了するとプロジェクトのコンテンツブラウザからダウンロードした木々のアセットを表示できます。
このアセットは後で使うので一旦このまま置いておきます。

UEの編集画面より、PCGで森を生成するための範囲を決めるために「PCGVolume」というアセットを生成します。
画面上部よりアセット追加ボタンを押し、検索して生成してください。

生成した範囲をワールド上に設置し、森を作成したい大きさに任意で設定します。

次に、この範囲とPCGで作成するルールを記載するアセットを紐づけます。

まずルールを記載するためにコンテンツブラウザ内に「PCGグラフ」を作成します。今回は「MyWorldPCG」と命名しました。

次に編集画面でアウトライナーより先ほど範囲を決めるために作成した「PCGVolume」を選択し、子要素の「PCGComponent」を選択します。

選択すると、インスタンス直下にGraphを選択する欄があるので、先ほど作成した「MyWorldPCG」を選択し、ルールと範囲を紐づけます。

続いて「MyWorldPCG」を編集してルールを作成します。

「MyWorldPCG」を開くとブループリントの編集画面のようなものがでてきます。

まずは「Surface Sampler」というノードを作成し、「Input」の「Landscape」ピンと繋ぎます。
このノードはSurface(面)に対してルールを適応させていくことができます。

Surface Sampler」を選択し、右側の設定画面から「Points Per Squared Meter 」の値を変更します。
この値は、 平方メートルあたりのポイント数を設定できます。今回は一旦「0.01」としました。

次に「Transform Point」ノードを作成し、右につなげます。
ここではアセットの大きさや向きを設定できます。

「Rotation Max」のZ値を360に設定します。これにより生成されたアセットの向きがランダムになります。
また「Scale Min」を0.7に設定します。これにより生成されたアセットの大きさが70~100%の間でランダムになります。

この「Transform Point」を選択した状態で、キーボードの「D」を押下します。
するとノードの右上に水色のマークがついていることを確認できます。これはデバッグ状態で表示できるモードであるという印です。
UE編集画面に戻ると、「Transform Point」で生成したアセット生成ポイントがデバッグ状態で見ることができます。(黒や白でブロックが置かれている部分に指定したアセットが表示される予定)

今作成した生成ポイントには大きな木を配置する予定なので、
続けて、小さな木を配置する用のポイントも追加します。

Surface Sampler」と「Transform Point」をコピーします。

Surface Sampler」の「Points Per Squared Meter 」の値を「0.1」にします。これにより先ほど作成した大きな木用のポイントの10倍の数のアセットが生成できます。
さらに「Point Extents」でブロックの大きさを変更します。デフォルトが「100」だったので半分の「50」に設定します。

この段階でUE編集画面に戻ると下記画像のように変更されます。

同様にさらに小さな草を生やすためのノードもコピーしました。

次に作成したポイントに実際のアセットを割り当てていきます。
「Static Mesh Spawner」ノードを作成します。

右側の設定画面で「Mesh Entries」の右側のプラスボタンを押し、配列を3つ作成します。

追加した配列の内部に入っていき「Description > Static Mesh」の順に開き、先ほどマーケットプレイスから追加した木のアセットを選択します。
木のアセットは「Contents > BlackAlder > Geometry > PivotPainter」の中にあります。

選択して割り当てたら、配列の残った2つにも同様に木のアセットを選択します。
この時、この3つの木のアセットがランダムで生成されるので、使いたい3種類の木のアセットを選択してください。

UE編集画面に戻ると下記画像のように大きな木がランダムで生成されているのを確認できます。

同様に、後2つの「Static Mesh Spawner」ノードを作成します。ここでは小さい木やさらに小さい草木のアセットをそれぞれ配置します。

配置が完了すると以下のようなフォトリアルな森が完成します。

上記の方法で、
数に関しては「Points Per Squared Meter 」の値を変更し
種類に関しては「Description > Static Mesh」のメッシュを変更することで、さまざまな種類の森を簡単に作ることができます。

おわりに

UE5.2の新機能であるプロシージャルコンテンツ生成フレームワーク(PCG:Procedural Content Generation Framework)の紹介を行いました。
画像でお見せしたようなフォトリアルなワールドがとても手軽に作成できるとても便利な機能だと感じました。
ルールベースでコンテンツを生成するので編集や複製なども容易にでき、今後の開発でも色々使用していきたいです。

ルールを作成することで、森の中に道を作成したり、その道にそって草を配置することなどもできるので、
次回はもう少し深掘りしたPCGの使用方法をご紹介します。

現在ISIDはweb3領域のグループ横断組織を立ち上げ、Web3およびメタバース領域のR&Dを行っております(カテゴリー「3DCG」の記事はこちら)。
もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください!
私たちと同じチームで働いてくれる仲間を、是非お待ちしております!
ISID採用ページ

執筆:@okazaki.wataru、レビュー:@wakamoto.ryosuke
Shodoで執筆されました