Was ist Geometrie-Scripting?
Geometry Scripting ist ein Plugin für Unreal Engine, das eine Reihe von Funktionsbibliotheken enthält, mit denen Mesh-Geometrie über Blueprints (BP) und Python erzeugt und bearbeitet werden kann. Alle verfügbaren Funktionen finden Sie in der Geometrie-Scripting-Referenz.
Die Geometrie-Scripting UFunctions und Blueprint-Knoten arbeiten mit UDynamicMesh-Objekten, wobei es sich um Objekte handelt, die mit der C++-Dreiecksmesh Datenstruktur FDynamicMesh3 erstellt wurden. Dies ist dieselbe Datenstruktur, die auch das Plugin Geometry Processing und der Editor-Modus Modeling verwenden.
Sie können das Geometrie-Scripting in Editor Utility Widgets und Asset Actions verwenden, um benutzerdefinierte Mesh-Analyse-, Verarbeitungs- und Bearbeitungswerkzeuge zu erstellen. Sie können es auch in Actor Blueprints verwenden, um prozedurale Objekte zu erstellen und komplexe geometrische Abfragen zu implementieren.
Das Geometrie-Scripting hat eine Vielzahl von Einsatzmöglichkeiten:
- Prüfung und Qualitätsanalyse von Drittimporteuren von Meshs.
- Analysieren von Mesh-UVs, um Assets mit verschwendetem Texturraum zu identifizieren.
- Gescriptete Zusammenführung von Mesh-Assets für Produktions-Workflows.
- Prozedurale Mesh-Actors wie die Level-Designwerkzeuge, die im Lyra-Beispielspiel verwendet werden.
Aktivieren des Plugins
Die Verwendung des Geometrie-Scripting erfordert das Aktivieren des entsprechenden Plugins.
So aktivieren Sie das Plugin oder überprüfen, ob es bereits aktiviert ist:
-
Wählen Sie in der Menüleiste Edit > Plugins aus.
-
Geben Sie in der Suchleiste „geometry script“ ein.
- Aktivieren Sie das Geometry Scripting-Plugin und wählen Sie Yes im Popup-Dialog aus.
- Starten Sie die Engine neu.
Dynamische Mesh-Objekte
Das Geometrie-Scripting kann mit mehreren neuen Objekttypen arbeiten:
UDynamicMeshUDynamicMeshComponentADynamicMeshActor
Ähnlich wie die Architektur des Statisches Mesh, der Statisches-Mesh-Komponente und des Statisches-Mesh-Actor sind diese Klassen nicht speziell Teil des Geometrie-Scripting-Plugins. Sie befinden sich im Geometry Framework-Engine-Modul und können unabhängig vom Geometrie-Scripting verwendet werden.
Dynamisches Mesh
Die Kernkomponente, die das Geometrie-Scripting ermöglicht, ist das Objekt UDynamicMesh. Dieses UObject ist ein Container für eine Mesh-Datenstruktur, die nicht an eine bestimmte Komponente gebunden ist. Im Gegensatz zu früheren Unreal Engine-Ansätzen wie UProceduralMeshComponent kann die Mesh-Geometrie ohne explizite Szenendarstellung erstellt und manipuliert werden.
Beispielsweise kann ein UDynamicMesh basierend auf einem UStaticMesh initialisiert, bearbeitet und dann wieder im Asset gespeichert werden. In Kombination mit Editor-Hilfsmittel-Widgets zur Bereitstellung der Benutzeroberfläche können technische Künstler benutzerdefinierte Mesh-Bearbeitungswerkzeuge in Blueprint erstellen oder Script-Mesh-Asset-Abfragen und -Bearbeitungen über Python durchführen.
Sie können auch verschiedene Actor-Geometrietypen in und aus UDynamicMesh konvertieren, wie z. B. Gameplay-Volumes.
Dynamische Mesh-Komponente
Neben UDynamicMesh wurde auch UDynamicMeshComponent zu einer „echten“ (nicht-vorübergehend, serialisierbar) Komponente gemacht. Diese Komponente ähnelt einer UProceduralMeshComponent, aber sie wird von einem UDynamicMesh unterstützt, das Sie mit Geometrie-Scripting manipulieren können.
UDynamicMeshComponent wurde in den letzten Jahren als Teil des Mesh-Modellierungswerkzeugsatzes entwickelt und bietet eine Echtzeit-Vorschau der Mesh-Bearbeitung. Ähnlich wie UProceduralMeshComponent unterstützt sie Aktualisierungen der Mesh-Geometrie – Scheitelpunktattribute und das Erstellen und Anpassen der gesamten Mesh-Topologie. Sie können diese Updates im Editor und zur Laufzeit durchführen.
Raytracing wird unterstützt, Nanite und Lumen jedoch nicht.
Dynamischer Mesh-Actor
ADynamicMeshActor ähnelt AStaticMeshActor, da es im Wesentlichen ein Container für eine UDynamicMeshComponent ist. Dynamische Mesh-Actors bieten jedoch spezifische Unterstützung für Actor Blueprints, die die prozedurale Mesh-Generierung basierend auf einem UDynamicMesh implementieren möchten.
Mit dynamischen Mesh-Actors können Sie mit Geometrie-Scripting und Modellierungsmodus-Werkzeugen neben Volumes auch beide Mesh-Actor-Typen erstellen und bearbeiten.
Generierter dynamischer Mesh-Actor
AGeneratedDynamicMeshActor ist eine Subklasse von ADynamicMeshActor, die zusätzliche Unterstützung für die Implementierung von Blueprint-basierten prozeduralen Mesh-Actors bietet. Insbesondere bietet diese Klasse die Funktion On Rebuild Generated Mesh, die in BP-Subklassen implementiert werden kann, um ein Mesh zu generieren, anstatt dies im Konstruktions-Script zu tun. Die Funktion bietet eine bessere interaktive Performance im Editor und ermöglicht künftig eine sorgfältigere prozedurale Geometriegenerierung im großen Maßstab.
Event On Rebuild Generated Mesh existiert nur in Actor Blueprints, die von der GeneratedDynamicMeshActor-Klasse abgeleitet werden. Außerdem ist die Funktion Generated Dynamic Mesh Actor derzeit nur Editor-exklusiv.
Wesentliche Unterschiede zwischen UStaticMesh und UDynamicMesh
Im Gegensatz zu UStaticMesh ist UDynamicMesh kein Asset. Eine UDynamicMeshComponent besitzt ihr UDynamicMesh, anstatt von mehreren Komponenten gemeinsam genutzt zu werden, wie bei UStaticMesh.
Dieser Unterschied bedeutet zum Beispiel, dass instanziertes Rendering nicht verfügbar ist.
Ein dynamisches Mesh wird nur in einem Level gespeichert und nicht in einer separaten Asset-Datei. Das Duplizieren einer UDynamicMeshComponent erstellt eine Kopie des Mesh (Erstellung eines neuen Mesh anstatt einer Instanz). Die Übertragung zwischen Levels oder Projekten muss durch Kopieren und Einfügen erfolgen.
In vielerlei Hinsicht verhält sich UDynamicMeshComponent mehr wie Mesh-Objekte in einem Werkzeug zur Erstellung digitaler Inhalte (DCC) wie Autodesk 3ds Max, Autodesk Maya oder Blender. Diese Handhabung führt zu potenziellen Problemen mit riesigen Meshs, die die Größe der Level-Datei drastisch erhöhen. Allerdings werden mit Eine Datei pro Actor die Mesh-Daten in der OFPA-Actor-Datei gespeichert und nicht im Level (also möglicherweise immer noch riesig, aber in einer separaten Datei).
Funktionsmuster
Die meisten Geometrie-Scripting-Funktionen folgen einem Standardmuster, ähnlich dem unten gezeigten Knoten Apply Mesh Plane Cut.
Das erste Argument, Target Mesh, ist das UDynamicMesh, das durch die Operation bearbeitet wurde. Im Allgemeinen modifizieren Geometrie-Scripting-Operationen das Input-Mesh, anstatt ein neues Mesh zu erstellen, um die Erstellung mehrerer temporärer Mesh-Objekte zu vermeiden. Der Input UDynamicMesh wird immer als Output zurückgegeben, auch bekannt als Target Mesh (gleicher Name == gleiches Objekt). Diese Einrichtung macht es einfach, mehrere Operationen hintereinander zu verketten.
Geometrie-Scripting-Knoten haben viele Parameter und Einstellungen. Wir haben die am häufigsten verwendeten Optionen als Argumente angegeben, aber Sie können zusätzliche Optionen in einer operationsspezifischen Options-Struktur finden. Die geläufigste Methode, um die richtige „Options“-Struktur zu erstellen, ist, den leeren Options-Pin zu ziehen. Zusätzlich können Sie mit der rechten Maustaste auf den Options-Pin klicken und das Split Struct Pin-Kontextmenü verwenden, um die „Options“-Struktur im Knoten direkt zu erweitern, wie unten gezeigt.
Die meisten Knoten haben auch einen Debug-Pin, um geometrischen Debugging-Support für Mesh-Generatoren zu bieten. Dies wird nicht aktiv verwendet, ist aber ein Platzhalter für zukünftige Funktionalität.
Verwenden von UDynamicMesh-Pools
Es ist üblich, temporäre Meshs innerhalb eines Mesh-Generators zu erstellen, beispielsweise wenn ein Grundkörper-Mesh vom Haupt-Mesh subtrahiert wird. Dafür wird ein temporäres UDynamicMesh benötigt. Sie können zwar mit der Funktion Construct Object From Class eines erstellen, müssen das Mesh nach der Verwendung aber dem Garbage Collector übergeben. Wenn Sie allerdings damit rechnen, den Generator häufig auszuführen, ist es effizienter, das Mesh über mehr Ausführungen hinweg wiederzuverwenden.
Der dynamische Mesh-Actor verfügt hierfür über integrierte Unterstützung mithilfe eines UDynamicMeshPool. Sie können dieses Setup verwenden, indem Sie Allocate Compute Mesh aufrufen, um ein temporäres Mesh zu holen, und es dann vor dem Ende des Blueprint-Ausführungspfads freigeben. Jedes temporäre Mesh kann explizit mit Release Compute Mesh freigegeben werden, oder durch Aufruf von Release All Compute Meshes, was alle aktuell allokierten temporären Meshs aus dem Pool zurückgibt.
In einem Editor-Hilfsmittelwidget gibt es keine dynamische Standard-Mesh-Pool-Instanz, aus der Meshs allokiert werden können. Sie können jedoch Create Dynamic Mesh Pool verwenden, um einen zu erstellen (z. B. als eine Variable im Editor-Hilfsmittelwidget oder im Hilfsmittel-Blueprint).
Erstellen eines prozeduralen Mesh
Wie bereits erwähnt, ist die Erstellung prozeduraler Meshs mit Actor-Blueprints ein Anwendungsfall für Geometrie-Scripting. Das folgende Beispiel verwendet eine BP-Subklasse von Generated Dynamic Mesh Actor. Das Event On Rebuild Generated Mesh füllt das UDynamicMesh einer UDynamicMeshComponent. Das UDynamicMesh wird an die Geometrie-Scripting-Funktion Append Box übergeben, die ein Mesh basierend auf den Input-Variablen erstellt.
Das Script erstellt ein parametrisches Box-Grundkörper-Mesh mit Parametern, die Künstler im Editor mit nur wenigen BP-Knoten anpassen können. Durch das Hinzufügen zusätzlicher Knoten können Sie immer komplexere Mesh-Generatoren direkt in Blueprints erstellen. Wie Sie dieses Script erweitern und mehr über Geometrie-Scripting erfahren finden Sie in Geometrie-Scripting durch Blueprints.

Zusätzliche Hinweise
Um zu prüfen, ob eine spezifische Funktion existiert, nutzen Sie die Geometrie-Scripting-Referenz Dokumentation.
Einige Funktionen (z. B. Apply PolyGroup Catmull Cook SubD) sind Editor-exklusiv verfügbar. Diese Einstellung bedeutet, dass Sie diese Funktionen nur in Editor-Hilfs-Actors/Actions/Widgets oder „Generated Dynamic Mesh Actor BP“-Subklassen verwenden können.
Die meisten Geometrie-Scripting-Funktionen Arbeit nur mit UDynmicMesh-Objekten. Es gibt Funktionen, um interne Mesh-Repräsentationen von einem Statisches Mesh, Skelett-Mesh oder Volumen-Actors in ein UDynamicMesh zu konvertieren, und Funktionen, um sie zurück zu konvertieren. Für andere Geometrie-Typen wie Landschaft, Geometrie-Caches oder -Sammlungen, Grooms und Stoff existieren keine Funktionen.
Aktuell unterstützt UDynamicMeshComponent die folgenden Funktionen nicht:
- Nanite
- Lumen
- Mesh-Distanzfeld
- LODs
- Instanziertes Rendering
Actor-Blueprints und Editor-Hilfsmittel-Blueprints werden stets im Spiel-Thread ausgeführt, weshalb Geometrie-Scripting-Funktionen, die aufgerufen werden, auch im Spiel-Thread ausgeführt werden. Einige Geometrie-Scripting-Funktionen führen Teile ihrer Arbeit intern in Aufgaben-Threads aus, zum Beispiel C++-Aufrufe an ParallelFor, Async oder UE::Tasks::Launch(). Das geschieht jedoch nur im Kontext einer einzigen Funktion, und die Funktion gibt nichts zurück, bis die gesamte parallele Arbeit abgeschlossen ist.