プロシージャルジオメトリ

Godotでジオメトリをプロシージャル(手続き的)に生成する方法は数多くあります。このチュートリアルシリーズでは、そのうちのいくつかを紹介します。各手法にはそれぞれ長所と短所があるため、それぞれの手法を理解し、特定の状況でどのように役立つかを理解しておくことが最善です。

注釈

ここで説明するすべてのプロシージャルジオメトリの生成方法は CPU 上で実行されます。Godot はまだ GPU 上でのジオメトリ生成をサポートしていません。

ジオメトリとは何ですか?

ジオメトリとは、形(シェイプ)を洒落た言い方で表現したものです。コンピュータグラフィックスでは、ジオメトリは通常「頂点」と呼ばれる位置の配列で表されます。 Godotではジオメトリはメッシュで表されます。

メッシュとは何ですか?

Godot には、名前に「メッシュ」が含まれるものが多数あります。 : MeshArrayMeshImmediateMeshMeshInstance3DMultiMeshMultiMeshInstance3D など。これらはすべて関連がありますが、用途が少し異なります。

MesheとArrayMeshは、MeshInstance3Dノードを使用して描画されるリソースです。 MesheやArrayMeshなどのリソースをシーンに直接追加することはできません。 MeshInstance3Dは、シーン内のメッシュの1つのインスタンスを表します。単一のメッシュを複数のMeshInstance3Dで再利用して、異なるマテリアルまたは変換(スケール、回転、位置など)を使用してシーンの異なる部分に描画することができます。

同じオブジェクトを何度も描画する場合は、MultiMeshとMultiMeshInstance3Dを使用すると便利です。 MultiMeshInstance3Dは非常に安価に何千回もメッシュを描画します。そのためには、ハードウェアのインスタンス化を利用します。 MultiMeshInstance3Dを使用する場合の欠点は、すべてのインスタンスで1つのマテリアルに制限されることです。インスタンス配列を使用して、インスタンスごとに異なる色と変換を保存しますが、すべてのインスタンスは同じマテリアルを使用します。

メッシュとは

メッシュは、1つ以上のサーフェスで構成されます。サーフェスは、頂点、法線、UVなどを含む複数のサブ配列で構成される配列です。通常、サーフェスとメッシュを構築するプロセスは、RenderingServer でユーザーから隠されていますが、ArrayMeshではユーザーは、サーフェス情報を含む配列を渡すことにより、メッシュを手動で構築できます。

サーフェス

各サーフェスには独自のマテリアルがあります。または、GeometryInstance3D.override_material を使用してMeshInstance3Dを使用するときに、メッシュ内のすべてのサーフェスのマテリアルをオーバーライドできます。

サーフェス配列

サーフェス配列は、長さ ArrayMesh.ARRAY_MAX の配列です。配列の各位置は、頂点ごとの情報を含むサブ配列で埋められます。たとえば、ArrayMesh.ARRAY_NORMAL にある配列は、頂点法線の PackedVector3Array です。

サーフェス配列はインデックス付きでもインデックス無しでもかまいません。非インデックス配列の作成は、インデックス ArrayMesh.ARRAY_INDEX で配列を割り当てないのと同じくらい簡単です。インデックスなしの配列には、すべての三角形の一意の頂点情報が格納されます。つまり、2つの三角形が頂点を共有する場合、頂点は配列内で複製されます。インデックス付きの表面配列は、各一意の頂点の頂点情報のみを格納し、頂点配列から三角形を構築する方法をマップするインデックスの配列も格納します。一般に、インデックス付き配列の使用は高速ですが、三角形間で頂点データを共有する必要があることを意味します。これは常に望ましいわけではありません(たとえば、面ごとの法線が必要な場合)。

ツール

Godotは、ジオメトリにアクセスして操作するさまざまな方法を提供します。それぞれの詳細については、次のチュートリアルで説明します。

ArrayMesh

ArrayMeshリソースはMeshを拡張して、いくつかの便利機能を追加したものです。最も重要なものはスクリプトによってMeshサーフェスを構築する機能です。

ArrayMeshの詳細については、ArrayMesh tutoria を参照してください。

MeshDataTool

MeshDataToolは、メッシュデータを、実行時に変更できる頂点、面、およびエッジの配列に変換するリソースです。

MeshDataToolの詳細については、MeshDataTool tutorial を参照してください。

SurfaceTool

SurfaceToolでは、OpenGL 1.xイミディエイトモードスタイルのインターフェイスを使用してメッシュを作成できます。

SurfaceToolの詳細については、SurfaceTool tutorial を参照してください。

ImmediateMesh

ImmediateMesh はオブジェクトを描画するために即時モードスタイルの、SurfaceTool のようなインターフェイスを使用するメッシュです。ImmediateMesh と SurfaceTool の違いは、ImmediateMesh はコードを使用して直接動的に描画されるのに対し、SurfaceTool は自由に使用できるメッシュを生成するために使用される点です。

ImmediateMesh は、そのわかりやすい API によりプロトタイピングに便利ですが、変更を加えるたびにジオメトリが再構築されるため、速度が遅くなります。視覚的なデバッグ用に単純なジオメトリを追加する場合 (例えば物理レイキャストを視覚化するために線を描くなど) に最も便利です。

ImmediateMeshの詳細については、ImmediateMeshチュートリアル を参照してください。

どちらを使うべきですか?

どの方法を使用するかは、何をしようとしているか、どのような手順に慣れているかによって異なります。

SurfaceToolとArrayMeshはどちらも、時間とともに変化しない静的なジオメトリ(メッシュ)の生成に最適です。

ArrayMesh を使用すると、SurfaceTool を使用するよりもわずかに高速になりますが、API は少し難しくなります。さらに SurfaceTool には generate_normals()index() などのいくつかの便利メソッドがあります。

ImmediateMesh は、ArrayMesh や SurfaceTool よりも制限が多くなっています。ただしフレームごとにジオメトリを変更する必要がある場合は、フレームごとに ArrayMesh を生成するよりもわずかに高速であり、より簡単なインターフェイスが提供されます。

MeshDataTool は高速ではありませんが、他のツールでは得られないメッシュのあらゆるプロパティ (エッジ、面など) にアクセスできます。メッシュを変換するためにそのようなデータが必要な場合は非常に便利ですが、その追加情報が必要ない場合は使用しない方がよいでしょう。MeshDataTool は、面またはエッジ配列へのアクセスを必要とするアルゴリズムを使用する場合に最適です。