ジオメトリ スクリプトとは?
ジオメトリ スクリプトは、Unreal Engine のプラグインです。ジオメトリ スクリプトには、ブループリントや Python を使用してメッシュ ジオメトリを生成および編集する機能を提供する一連の関数ライブラリが含まれています。
ジオメトリ スクリプトの UFunction およびブループリント ノードは、UDynamicMesh オブジェクトで動作します。UDynamicMesh オブジェクトは、FDynamicMesh3 C++ 三角ポリゴン メッシュ データ構造を使用して作成されるオブジェクトです。このデータ構造は、Geometry Processing プラグインおよびモデリング エディタ モードで使用されるデータ構造と同じです。
エディタ ユーティリティ ウィジェットやアセット アクションでジオメトリ スクリプトを使用すると、カスタム メッシュ解析/処理/編集ツールを作成することができます。また、ジオメトリ スクリプトをアクタ ブループリントで使用して、「プロシージャル オブジェクト」を作成し、複雑なジオメトリ クエリを実装することもできます。
ジオメトリ スクリプトは次をはじめとする幅広い用途で使用できます。
サードパーティ メッシュ インポータのテストおよび品質分析。
メッシュ UV を分析して、無駄なテクスチャ空間を含むアセットを特定する。
プロダクション ワークフローのためのメッシュ アセットのスクリプト化されたマージ。
Lyra サンプル ゲーム で使用されているレベル デザイン ツール オブジェクトなどのプロシージャル メッシュ アクタ。
DynamicMesh オブジェクト
ジオメトリ スクリプトは、次の複数の新しいオブジェクト タイプで動作します。
UDynamicMesh
UDynamicMeshComponent
ADynamicMeshActor
スタティック メッシュ/StaticMeshComponent/StaticMeshActor アーキテクチャと同様に、これらのクラスは厳密には Geometry Script プラグインの一部ではありません。そのため、これらのクラスは、Geometry Framework エンジン モジュール内に格納されており、ジオメトリ スクリプトとは独立して使用することができます。
UDynamicMesh
ジオメトリ スクリプトを使用可能にするコア コンポーネントは UDynamicMesh オブジェクトです。この UObject は、特定のコンポーネントに関連付けられていないメッシュ データ構造用のコンテナです。これは、明示的なシーン表現を使用することなくメッシュ ジオメトリを作成および操作できるという点で、UProceduralMeshComponent などのこれまでの Unreal Engine のアプローチとは異なります。
たとえば、UDynamicMesh は UStaticMesh アセットに基づいて初期化および編集してから、アセットに再度格納することができます。ユーザー インターフェースを提供するエディタ ユーティリティ ウィジェットとこのアプローチを併用することで、テクニカル アーティストはブループリントでカスタマイズされた専用のメッシュ編集ツールを作成したり、Python を使用してメッシュ アセットのクエリ/編集操作をスクリプト化したりすることができます。
また、ゲームプレイ ボリュームなど、エディタのその他の各種メッシュ ジオメトリも UDynamicMesh との間で変換することができます。
DynamicMeshComponent
UDynamicMesh に加えて、UDynamicMeshComponent も「リアル」(一時的でなく、シリアル化可能) コンポーネントに昇格されました。このコンポーネントは、UProceduralMeshComponent に類似しているものの、UDynamicMesh によってサポートされているため、ジオメトリ スクリプトで操作することができます。
UDynamicMeshComponent は、メッシュ編集のリアルタイム プレビューを提供するために使用されるメッシュ モデリング ツールセットの一部として過去数年にわたり開発されてきました。UDynamicMeshComponent は、UProceduralMeshComponent と同様に、メッシュ ジオメトリの更新をサポートしており、頂点属性の更新だけでなく、メッシュ トポロジ全体の作成と変更にも対応しています。これはエディタ内とランタイム時の両方で実行できます。レイ トレーシングはサポートされていますが、Nanite と Lumen はサポートされていません。
DynamicMeshActor
ADynamicMeshActor は、UDynamicMeshComponent のコンテナであるという点では、AStaticMeshActor と似ています。ただし、DynamicMeshActor は、UDynamicMesh に基づくプロシージャル メッシュの生成を実装したいアクタ ブループリントに対して、固有のサポートを提供しています。
以前は新しいスタティック メッシュ アセットしか作成できなかったモデリング モード ツールが、新しい DynamicMeshActor も作成できるようになり、編集ツールは (ボリュームに加えて) どちらのタイプのメッシュ アクタも編集できるようになりました。
GeneratedDynamicMeshActor
AGeneratedDynamicMeshActor は ADynamicMeshActor のサブクラスで、ブループリントに基づくプロシージャル メッシュ アクタを実装するための追加サポートを提供します。具体的には、このクラスは、ブループリント サブクラスで実装可能な関数 On Rebuild Generated Mesh を提供します。この関数は、コンストラクション スクリプトに代わって、メッシュを生成することができます。これにより、エディタ内でのインタラクティブなパフォーマンスが向上します。さらに、将来的にはより慎重に管理された大規模なプロシージャル ジオメトリの生成につなげることができます。
GeneratedDynamicMeshActor は、現時点ではエディタ専用です。
UStaticMesh と UDynamicMesh の主な相違点
UStaticMesh と異なり、UDynamicMesh はアセットではありません。UDynamicMeshComponent はその UDynamicMesh を「所有」するため、UStaticMesh のように複数のコンポーネント間で共有されることはありません。これは、たとえば、インスタンス化されたレンダリングを使用することはできません。UStaticMesh は、ProceduralMeshComponent と同様に、コンポーネント (およびアクタ) の一部として格納されます。これは、メッシュが別のアセット ファイルではなく、「レベル」に格納されることを意味します。UDynamicMeshComponent を複製すると、メッシュの コピー が作成されるため、レベルまたはプロジェクト間での転送は、コピー&ペースト で実行する必要があります。
多くの点で、UDynamicMeshComponent は Autodesk 3ds Max、Autodesk Maya、Blender などの DCC ツールのメッシュ オブジェクトに非常によく似た動作をします。このことにより、巨大なメッシュがレベル ファイルのサイズを大幅に増加させるという問題が発生する可能性があります。ただし、 One File Per Actor (アクタあたり 1 つのファイル) を使用すると、メッシュ データがレベルではなく OFPA アクタ ファイルとともに格納されます (そのため、依然としてサイズが巨大になる可能性があるものの、別のファイルに保存される)。
GeometryScript 関数/ノード パターン
ほとんどのジオメトリ スクリプトの関数/ノードは、以下に示す Apply Mesh Plane Cut ノードと同様の、きわめて標準的なパターンに従います。
最初の引数 Target Mesh は、操作によって編集される UDynamicMesh です。通常、ジオメトリ スクリプトの操作は新しいメッシュを作成するのではなく、入力メッシュを変更することで、一時的なメッシュ オブジェクトが複数作成されることを回避します。入力された UDynamicMesh は常に Target Mesh (同じ名前 == 同じオブジェクト) という名称の出力として返されます。このことにより、より簡単に複数の操作を順番に処理することができます。
ジオメトリ スクリプト ノードには、多くのパラメータと設定があります。よく使用されるオプションは引数として公開されています。ただし、その他のオプションは操作固有の オプション 構造体を介して提供されます。適切なオプション構造体を作成するもっとも一般的な方法は、空の Options ピンをドラッグすることです。これは、デフォルトを変更する必要がある場合以外は、必要ありません。さらに、以下のように、Options ピンを右クリックして、[Split Struct Pin (構造体ピンを分割)] コンテキスト メニュー項目を使用すると、ノード内のオプション構造体を直接展開することができます。
ほとんどのノードには、メッシュ ジェネレータのジオメトリ デバッグのサポートを提供する Debug ピンもあります。このピンは積極的に使用されるものではありませんが、将来の機能のためのプレースホルダです。
UDynamicMesh プールを使用する
「メイン」メッシュから減算されるプリミティブ メッシュを作成するなど、メッシュ ジェネレータ内で一時的なメッシュを作成する必要が生じることはよくあります。このためには、一時的な UDynamicMesh が必要です。一時的な UDynamicMesh は ConstructObjectFromClass を使用して作成できますが、プロシージャル ジェネレータでこれを作成する場合、使用後にそのメッシュをガベージ コレクトする必要があります。ジェネレータが頻繁に実行される場合は、複数回の実行でメッシュを再利用する方が効率的です。
DynamicMeshActor は、UDynamicMeshPool を使用して、これに対応するためのビルトインのサポートを備えています。これは、AllocateComputeMesh を呼び出して一時的なメッシュを取得してから、ブループリントの実行パスが終了する前の任意の箇所でそれを解放することで行うことができます。各一時的なメッシュは ReleaseComputeMesh を使用するか、ReleaseAllComputeMeshes を呼び出すことで、明示的に解放できます。これにより、現在割り当てられている一時的なメッシュをプールから解放します。
エディタ ユーティリティ ウィジェットには、メッシュを割り当てるためのデフォルトの DynamicMeshPool インスタンスはないものの、CreateDynamicMeshPool を使用して、このインスタンスを (エディタ ユーティリティ ウィジェットまたはユーティリティ ブループリントの変数などとして) 作成できます。
アクタ ブルーペイントを使用してプロシージャル メッシュ オブジェクトを作成する
説明したように、ジオメトリ スクリプトの興味深い使用例の 1 つに、アクタ ブループリントを使用してプロシージャル メッシュ「オブジェクト」を作成するという使用例があります。以下に、GeneratedDynamicMeshActor のブループリント サブクラスを使用した例を示します。On Rebuild Generated Mesh Event を使用して、UDynamicMeshComponent の UDynamicMesh に入力します。これらのクラスについては、「ジオメトリ スクリプトのリファレンス」を参照してください。UDynamicMesh は、ジオメトリ スクリプト関数の Append Box に渡され、入力変数に基づいてメッシュが作成されます。
以下のクリップは、このブループリント アクタのインスタンスを使用した例です。基本的に、ブループリント ノードを数個のみ使用して、パラメトリック ボックス プリミティブ メッシュを作成しました。ノードを追加することで、はるかに複雑なメッシュ ジェネレータをブループリントで直接作成することができます。現在のジオメトリ スクリプト ライブラリには、メッシュ生成および編集のための 150 以上の関数/ノードが含まれています。