Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Prozedurale Geometrie

Es gibt viele Möglichkeiten, Geometrie in Godot prozedural zu erzeugen. In dieser Tutorial-Artikelreihe werden wir einige von ihnen erkunden. Jede Technik hat ihre eigenen Vor- und Nachteile, daher ist es am besten, jede einzelne zu verstehen und zu wissen, wie sie in einer bestimmten Situation nützlich sein kann.

Bemerkung

Alle hier beschriebenen Methoden der prozeduralen Geometrieerzeugung laufen auf der CPU. Godot unterstützt die Erzeugung von Geometrie auf der GPU noch nicht.

Was ist Geometrie?

Geometrie ist eine schicke Umschreibung für Form. In der Computergrafik wird die Geometrie in der Regel durch eine Liste von Positionen dargestellt, die als "Vertices" bezeichnet werden. In Godot wird die Geometrie durch Meshes dargestellt.

Was ist ein Mesh?

Viele Dinge in Godot haben mesh in ihrem Namen: das Mesh, das ArrayMesh, das ImmediateMesh, das MeshInstance3D, das MultiMesh, und das MultiMeshInstance3D. Obwohl sie alle miteinander verwandt sind, haben sie leicht unterschiedliche Verwendungszwecke.

Meshes und ArrayMeshes sind Ressourcen, die mit einem MeshInstance3D-Node gezeichnet werden. Ressourcen wie Meshes und ArrayMeshes können nicht direkt zur Szene hinzugefügt werden. Ein MeshInstance3D stellt eine Instanz eines Meshes in Ihrer Szene dar. Sie können ein einzelnes Mesh in mehreren MeshInstance3Ds wiederverwenden, um es in verschiedenen Teilen Ihrer Szene mit unterschiedlichen Materialien oder Transformationen (Skalierung, Drehung, Position usw.) zu zeichnen.

Wenn Sie dasselbe Objekt viele Male zeichnen wollen, kann es hilfreich sein, ein MultiMesh mit einem MultiMeshInstance3D zu verwenden. MultiMeshInstance3Ds zeichnen Meshes tausende Male sehr kostengünstig, indem sie die Vorteile der Hardware-Instanziierung nutzen. Der Nachteil bei der Verwendung eines MultiMeshInstance3D ist, dass jede Oberfläche des Meshes auf ein Material für alle Instanzen beschränkt ist. Es verwendet ein Instanz-Array, um verschiedene Farben und Transformationen für jede Instanz zu speichern, aber alle Instanzen jeder Oberfläche verwenden das gleiche Material.

Was ein Mesh ist

Ein Mesh besteht aus einer oder mehreren Oberflächen. Eine Oberfläche ist ein Array, das aus mehreren Unter-Arrays besteht, die Vertices, Normalen, UVs usw. enthalten. Normalerweise wird der Prozess der Konstruktion von Oberflächen und Meshes vor dem Benutzer im RenderingServer verborgen, aber mit ArrayMeshes kann der Benutzer ein Mesh manuell konstruieren, indem er ein Array mit den Oberflächeninformationen übergibt.

Oberflächen

Jede Oberfläche hat ihr eigenes Material. Alternativ können Sie das Material für alle Oberflächen im Mesh überschreiben, wenn Sie eine MeshInstance3D mit der Property material_override verwenden.

Oberflächen-Array

Das Oberflächen-Array ist ein Array der Länge ArrayMesh.ARRAY_MAX. Jede Position im Array wird mit einem Sub-Array gefüllt, das Informationen pro Vertex enthält. Zum Beispiel ist das Array an ArrayMesh.ARRAY_NORMAL ein PackedVector3Array von Vertex-Normalen. Siehe Mesh.ArrayType für weitere Informationen.

Das Oberflächen-Array kann indiziert oder nicht-indiziert sein. Die Erstellung eines nicht-indizierten Arrays erfolgt einfach durch die Nichtzuweisung eines Arrays mit dem Index ArrayMesh.ARRAY_INDEX. Ein nicht-indiziertes Array speichert eindeutige Vertexinformationen für jedes Dreieck, was bedeutet, dass, wenn zwei Dreiecke einen Vertex teilen, der Vertex im Array dupliziert wird. Ein indiziertes Oberflächenarray speichert nur Vertexinformationen für jeden einzelnen Vertex und speichert dann auch ein Array mit Indizes, die zeigen, wie die Dreiecke aus dem Vertexarray zu konstruieren sind. Im Allgemeinen ist die Verwendung eines indizierten Arrays schneller, aber es bedeutet, dass Sie die Vertexdaten zwischen den Dreiecken teilen müssen, was nicht immer erwünscht ist (z. B. wenn Sie Normalen pro Fläche wünschen).

Tools

Godot bietet verschiedene Möglichkeiten für den Zugriff auf und die Arbeit mit Geometrie. Weitere Informationen zu den einzelnen Möglichkeiten werden in den folgenden Tutorials gegeben.

ArrayMesh

Die ArrayMesh-Ressource erweitert Mesh um einige Funktionen zur Verbesserung der Benutzerfreundlichkeit und vor allem um die Möglichkeit, eine Mesh-Oberfläche per Skripting zu erstellen.

Weitere Informationen zum MeshDataTool finden Sie im ArrayMesh-Tutorial.

MeshDataTool

Das MeshDataTool ist eine Ressource, die Mesh-Daten in Arrays von Vertices, Flächen und Kanten konvertiert, die zur Laufzeit geändert werden können.

Weitere Informationen zum MeshDataTool finden Sie im MeshDataTool-Tutorial.

SurfaceTool

Das SurfaceTool ermöglicht die Erstellung von Meshes über eine Schnittstelle im Stil des OpenGL 1.x Immediate Mode.

Weitere Informationen zum SurfaceToolfinden Sie im SurfaceTool-Tutorial.

ImmediateMesh

ImmediateMesh is a mesh that uses an immediate mode style interface (like SurfaceTool) to draw objects. The difference between ImmediateMesh and the SurfaceTool is that ImmediateMesh is drawn directly with code dynamically, while the SurfaceTool is used to generate a Mesh that you can do whatever you want with.

ImmediateMesh ist wegen seiner unkomplizierten API nützlich für das Prototyping, aber es ist langsam, weil die Geometrie bei jeder Änderung neu aufgebaut wird. Am nützlichsten ist es für das Hinzufügen einfacher Geometrie zur visuellen Fehlersuche (z. B. durch das Zeichnen von Linien zur Visualisierung von physikalischen Raycasts usw.).

Weitere Informationen zu ImmediateGeometry finden Sie im ImmediateGeometry-Tutorial.

Welche sollte ich verwenden?

Welchen Ansatz Sie wählen, hängt davon ab, was Sie erreichen wollen und mit welcher Art von Verfahren Sie zufrieden sind.

Sowohl SurfaceTool als auch ArrayMesh eignen sich hervorragend für die Erzeugung statischer Geometrien (Meshes), die sich im Laufe der Zeit nicht verändern.

Die Verwendung eines ArrayMesh ist etwas schneller als die eines SurfaceTools, aber die API ist etwas anspruchsvoller. Außerdem hat SurfaceTool ein paar benutzerfreundliche Methoden wie generate_normals() und index().

ImmediateMesh ist stärker eingeschränkt als ArrayMesh und SurfaceTool. Wenn sich die Geometrie jedoch ohnehin bei jedem Frame ändern muss, bietet es eine viel einfachere Schnittstelle, die etwas schneller sein kann als die Erzeugung eines ArrayMesh bei jedem Frame.

Das MeshDataTool ist nicht schnell, aber es gibt Ihnen Zugriff auf alle möglichen Propertys des Meshes, die Sie mit den anderen nicht erhalten (Kanten, Flächen usw.). Es ist unglaublich nützlich, wenn man diese Art von Daten benötigt, um das Mesh zu transformieren, aber es ist keine gute Idee, es zu verwenden, wenn diese zusätzlichen Informationen nicht benötigt werden. Das MeshDataTool ist am besten geeignet, wenn Sie einen Algorithmus verwenden, der Zugriff auf das Flächen- oder Kanten-Array benötigt.