手続き型ジオメトリ(幾何)

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

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

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

メッシュとは何ですか?

Godotの多くの物には名前にメッシュがあります: MeshArrayMeshMeshInstanceMultiMesh、および:ref:` MultiMeshInstance <class_MultiMeshInstance> `。それらはすべて関連がありますが、用途が少し異なります。

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

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

メッシュとは

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

サーフェス

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

サーフェス配列

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

The surface array can be indexed or non-indexed. Creating a non-indexed array is as easy as not assigning an array at the index ArrayMesh.ARRAY_INDEX. A non-indexed array stores unique vertex information for every triangle, meaning that when two triangles share a vertex, the vertex is duplicated in the array. An indexed surface array only stores vertex information for each unique vertex and then also stores an array of indices which maps out how to construct the triangles from the vertex array. In general, using an indexed array is faster, but it means you have to share vertex data between triangles, which is not always desired (e.g. when you want per-face normals).

ツール

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

ArrayMesh

ArrayMeshリソースはMeshを拡張して、いくつかの異なるQOL(利便性向上用の)関数を追加します。最も重要なことは、スクリプティングによってMeshサーフェスを構築する機能です。

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

MeshDataTool

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

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

SurfaceTool

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

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

ImmediateGeometry

ImmediateGeometryは、イミディエイトモードスタイルのインターフェイス(SurfaceToolなど)を使用してオブジェクトを描画するノードです。 ImmediateGeometryとSurfaceToolの違いは、ImmediateGeometryはシーンツリーに追加できるノード自体であり、コードから直接描画されることです。 SurfaceToolは、表示するMeshInstanceに追加する必要があるメッシュを生成します。

ImmediateGeometryは、簡単なAPIのためにプロトタイピングに役立ちますが、ジオメトリがフレームごとに再構築されるため、速度が遅くなります。単純なジオメトリをすばやく追加して視覚的にデバッグするのに最も役立ちます(たとえば、物理的なレイキャストなどを視覚化するために線を描画する)。

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

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

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

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

Using an ArrayMesh is slightly faster than using a SurfaceTool, but the API is a little more challenging. Additionally, SurfaceTool has a few quality of life methods such as generate_normals() and index().

ImmediateGeometry regenerates the mesh every frame, so it is much slower than ArrayMesh or SurfaceTool. However, if you need the geometry to change every frame anyway, it provides a much easier interface that may even be a little faster than generating an ArrayMesh every frame.

The MeshDataTool is not fast, but it gives you access to all kinds of properties of the mesh that you don't get with the others (edges, faces, etc.). It is incredibly useful when you need that sort of data to transform the mesh, but it is not a good idea to use it if that information is not needed. The MeshDataTool is best used if you are going to be using an algorithm that requires access to the face or edge array.