制作

CEDEC2020レポート:オープンワールドを、自然に意思を持って埋める。 LUMINOUS ENGINEのプロシージャルへの取り組み

投稿日:

講演者
 岩崎 浩
 山本 健斗
 濵野 翔平

序盤は講演内容の書き起こし、最後に個人的な見解を記載します!

■広いワールドマップをどう編集するか?

過去の取り組み
 LUMINOUS ENGINE
 FF15で使用

その時点でカーブを引く、植物を塗る、地形を上げ下げする、ということがリアルタイムで出来る環境だった。
岩や急斜面には植物をはやさない、という機能もあり。
高速に編集できる環境ではあった。

・過去の課題

編集コストがまだ高い

高速に塗れるけどそれでも追いつかないくらいにワールドマップは広い

少し賢い言機能がブラックボックス化している
拡張するにはプログラマに依頼する必要がある

地形が変わったとき、再編集する必要があった

・新しいツールの目標

ミクロからマクロまで
 細かな手作業から大域の自動生成まで

拡張、応用しやすく
 単純な処理の組み合わせで表現できるように
 ノードベースでプロシージャルの演算を定義

毎回同じ結果
 同じ入力に対しては同じ結果が生成される(ランダム要素の排除)
 ワールド広域を生成しても、カメラに写っている一部の未精製しても、結果が同じになるようにする

結果をリアルタイムに確認

■プロシージャルの話

演算をどう組み合わせて、プロシージャルを作っていくか?

・プロシージャル植生

ワールドエディタ
様々なマスクをノードベースで掛け合わせて意図を持ったマスクを生成し、そこに下草などのFoliageなどをはやしたりEffectや環境設定の配置、パラメータ設定をすることが出来るオープンワールド特化のプロシージャルエディタ

マスクの調整で自動で植生を行っている

・マスクの内訳

各種ノイズマスク
 Perlin Noise
 fBm
 Random Noise

各種基本的なノイズマスクと地形から取得された地面法線やオクルージョン、浸食マスクなど
これらを何度も掛け合わせることで、意図を持った目的のマスク範囲を出力している

地形テクスチャ
 Ground Normal
 Ground Occlusion
 Erosion Mask

マスクや地形情報をベースにポイントを生成するというのはHOUDINIなどでも工夫次第で実現できる

・花畑での例

咲いている、咲いてない、の2種類のマスクを用意する
 ↓
咲いている状態と咲いていない状態を減算して2植化する

・木の例

地形情報を使用する
木を配置するベースマスクの作成
地形のオクルージョンからマスクを取得し崖になりそうなところを法線から取得し取り除く
ノイズでムラやそもそも木が生えない砂漠のようなほかで作成されたマスクエリアがあれば減産して、最終的にアーティストのマスクペイントを掛け合わせる

・森の例

同じマスクであっても条件次第で木がまばらに生えたり密集したりするのでそのまま木の配置マスクを森のマスクとして使用できないポイントの生成から精製したマスクを使用
通常の植物が森マスクと重なっているときは植物を森の植物に変える
花畑のように日向に生えるものと森マスクが重なっているときは減算
木の根もとのマスクと森マスクが掛け合わされると森の堆積物などを生成する
森の中心のほうが気が大きくなるように

・マスクベースのノードネットワーク

 工夫次第でいろいろ植生表現できる

・エンジン上でリアルタイム反映

 最終がすぐに確認できて超便利

■ワークフローの話

プロシージャルと、レベル作業者をどうつなぐか?

・課題

部分的な対応に弱い

ネットワークの作成難度
→アーティストが簡単に編集に参加できる仕組みが必要

・プロシージャルを構成するマスクの上書き

リージョンマスク
 ↓
エリアマスク
 ↓
サブエリアマスク

という優先順をつけている

マスクの塗り分けで専用の景色に変わる
マスクの掛け合わせなどにも対応

・レイアウトとの連携

コリジョンをマスクとして取得

コリジョンから判定できるのであれば様々な工夫が可能

ある程度大きな岩があれば、地域からの影響(上面に草マテリアルをはやすとか)、大きな石属性モデル周りの特別処理などを入れることが出来る
→単調でない見た目になる

地面同士のなじませや川と陸のつなぎ目などのなじませも対応

・オリジナル植生の追加

部分的な配置への対応

■処理の中身の話

どのように処理を回しているか?

・目指したものは

よりシンプルな操作でより複雑な結果を
あとで細かい修正ができれば、大まかには良い感じなっていればOKなはず

・データ生成のワークフロー

プロシージャル定義

レベル上にゲームオブジェクトとして配置

パラメータ編集(パスとかの設定)

出力ファイル更新

・必要なのネットワーク(処理情報)のパスとプロシージャルの適用範囲

編集するのは「プロシージャルの入力データ」、出力データではない
配置データは、専用サーバーで定期ビルド

・データの編集はどうやるのか?

基本ツール紹介
 Sclupt…地形の上げ下げ、滑らかにする
 Paint…森というIDをペイントしているイメージ
 Curve…川のように複数のカーブが連携しているものも対応している

・カスタムパラメータ

同じようなエリアを作成する場合
 リソースだけ変更したい
 生成数だけ調整したい

同じパラメータに対して調整データを設定できるようにすることによって、1個のデータで違う地形出力を行うことが出来る

・レイヤーデータ

パラメータの差異がある部分だけメタデータ化する

レイヤーごとに編集することが可能

■処理の中身の話

目指したのは発展性
 応用、拡張、メンテナンスのしやすさ

単純さを保つ

どれだけ一般化できるかが大事

・入力
外部画像ファイル
塗るマスク
カーブ
ノイズ
地面情報など
レベルのゲームオブジェクト
演算処理

・出力
地形
植物配置
ゲームオブジェクトは一
エフェクト配置
メッシュ生成

たくさん種類があるがバリエーションは重要

・単純さを守るのは間を流れるデータ

間を流れるデータの種類はマスクとポイントクラウドのみ

・マスク

画像みたいなデータ
座標から値が決まる
データの総数はない
 解像度の概念は原則ない

・ポイントクラウド

構造体の配列みたいなデータ
インデックスから値が決まる
データの総数がある

この2種類で全部表現可能(※いまのところ)

・カーブもポイントクラウド

カーブはベジェ曲線の集合
ベジェ曲線の持ち方
P0→ポイントクラウドの座標
P1→P0からの相対座標
P2→P3からの相対座標
P3→持たない(次の番号のポイントクラウドのP0)

・リソースリストもポイントクラウド

モデルファイルのリスト

3つの木をリスト化してどれかを配置、みたいな目的に使う。

・編集方法

マスクの編集
 塗る、スカルプト

ポイントクラウドの編集
 選択して編集
 カーブとして編集

マスク→座標で値が決まる
ポイントクラウド→インデックスで値が決まる

・演算の基本ルール

入力を主と従にわける。出力は主と同じ種類として出力

 マスクとマスクの入力なら出力はマスク

 ポイントクラウドとポイントクライドの入力なら出力はマスク

 ポイントクラウドが主でマスクが従の場合は出力はポイントクラウド
 →ポイントクラウドはPositionを持っていると思うのでそれをもとにマスクからデータを取得
  ポイントクラウドに座標がない場合は、原点のマスクの値を取得

 マスクが主でポイントクラウドが従の場合は禁止

マスクとポイントクラウドは相互変換可能

・ルールまとめ

演算で扱うデータはマスクとポイントクラウドのみ
マスクとポイントクラウドは相互変なkン可能
マスクとポイントクラウドは演算可能

・処理の順番

処理は逆順
最終結果に必要なデータのみを計算するため
リアルて医務で編集結果を確認できるようにするために16m×16mのブロック単位で計算しています

・少し特殊なケース

依存関係がある
配置した岩の上に草を配置したい

phaseという仕組み
 phaseごとに順番に処理
 phaseを決めるのは出力。逆順だから

・まとめ

マスクとポイントクラウドお組み合わせで多くの表現を可能にしました
プロシージャル処理をオープンすることで、アーティストが意志を持って自動配置できるようになりました

■感想

それなりに難易度が高い講義だったけれども、予備知識があったためある程度理解できた。

今の新卒はいきなりこういった開発に入れられるかもしれない、ということを考えるとかわいそうだなあと思う。

LUMINOUS ENGINE自体が素晴らしいのは当然なんですが、それをどう考えて作っているかという部分が非常にためになりました。

後追いで同じようなものを作るにしても、コンセプトがわかっているのといないのとでは進捗も出来上がりも天と地の差が出ると思います。

もうオープンワールドのマップはデザイナーがデザインするというよりは、デザイナーがコンセプトを作成して自動生成してもらう段階に入っているのでしょう。

-制作
-

Copyright© ゲームプロマネのブログ , 2020 All Rights Reserved Powered by STINGER.