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

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 です。

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

ツール

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はどちらも、時間とともに変化しない静的なジオメトリ(メッシュ)の生成に最適です。

ArrayMeshの使用は、SurfaceToolの使用よりもわずかに高速ですが、APIはもう少し挑戦的です。さらに、SurfaceToolには generate_normals()index() などの利便性向上メソッドがいくつかあります。

ImmediateGeometryはフレームごとにメッシュを再生成するため、ArrayMeshやSurfaceToolよりもはるかに低速です。ただし、とにかくすべてのフレームを変更するためにジオメトリが必要な場合は、すべてのフレームでArrayMeshを生成するよりも少し速い可能性がある、はるかに簡単なインターフェイスを提供します。

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