Verwenden von Navigations-Meshes

../../_images/nav_meshes.webp

2D- und 3D-Versionen des Navigations-Mesh sind als NavigationPolygon bzw. NavigationMesh verfügbar.

Bemerkung

Ein Navigations-Mesh beschreibt nur einen durchquerbaren Bereich für die zentrale Position eines Agenten. Alle Radiuswerte, die ein Agent haben kann, werden ignoriert. Wenn Sie möchten, dass die Wegfindung die (Kollisions-) Größe eines Agenten berücksichtigt, müssen Sie das Navigations-Mesh entsprechend verkleinern.

Die Navigation funktioniert unabhängig von anderen Teilen der Engine wie Rendering oder Physik. Navigations-Meshes sind die einzigen Dinge, die bei der Wegfindung berücksichtigt werden, d.h. visuelle Elemente und Collision Shapes werden vom Navigationssystem komplett ignoriert. Wenn Sie andere Daten (wie z.B. das Bildmaterial) bei der Wegfindung berücksichtigen wollen, müssen Sie Ihre Navigations-Meshes entsprechend anpassen. Der Prozess der Berücksichtigung von Navigationsbeschränkungen in Navigations-Meshes wird gemeinhin als "Navigations-Mesh-Backen" bezeichnet.

Vergleich zwischen konvexen und konkaven Polygonen in Navigationsmeshes

Ein Navigations-Mesh beschreibt eine Fläche, auf der ein Agent sicher stehen kann, wobei sein Zentrum mit den Physik-Shapes verglichen wird, die äußere Kollisionsgrenzen beschreiben.

Wenn Sie beim Verfolgen von Navigationspfaden auf Clipping- oder Kollisionsprobleme stoßen, denken Sie immer daran, dass Sie dem Navigationssystem über ein geeignetes Mesh mitteilen müssen, was Sie vorhaben. Das Navigationssystem selbst wird nie wissen, ob es sich um einen Baum, einen Felsen, eine Wand oder ein visuelles Mesh handelt, denn es weiß nur: "mir wurde gesagt, dass ich diesen Weg sicher gehen kann, weil er auf einem Navigations-Mesh liegt".

Das Backen eines Navigations-Meshes kann entweder durch die Verwendung einer NavigationRegion2D oder NavigationRegion3D, oder durch die direkte Verwendung der NavigationServer2D- und NavigationServer3D-API erreicht werden.

Backen eines Navigations-Meshes mit einer NavigationRegion

Schritte zum Backen von Navigations-Meshes

Backen eines Navigations-Meshes mit Agentenradiusversatz zur Geometrie.

Das Backen des Navigations-Meshs wird durch den NavigationRegion-Node zugänglicher gemacht. Beim Backen mit einem NavigationRegion-Node werden die einzelnen Schritte des Parsens, Backens und der Regionsaktualisierung in einer Funktion zusammengefasst.

Die Nodes sind in 2D und 3D als NavigationRegion2D bzw. NavigationRegion3D verfügbar.

Tipp

The navigation mesh source_geometry_mode can be switched to parse specific node group names so nodes that should be baked can be placed anywhere in the scene.

Wenn ein NavigationRegion2D-Node im Editor ausgewählt wird, erscheinen in der oberen Leiste des Editors die Backoptionen sowie die Polygonzeichenwerkzeuge.

../../_images/nav_region_baking_01.webp

Damit die Region funktioniert, muss eine NavigationPolygon-Ressource hinzugefügt werden.

Die Propertys zum Analysieren und Backen eines Navigations-Mesh sind dann Teil der verwendeten Ressource und können im Ressourceninspektor gefunden werden.

../../_images/nav_region_baking_02.webp

Das Ergebnis des Parsens der Quellgeometrie kann mit den folgenden Propertys beeinflusst werden.

  • Der parsed_geometry_type, der filtert, ob visuelle Objekte oder physikalische Objekte oder beide aus dem SceneTree geparst werden sollen. Für weitere Details darüber, welche Objekte geparst werden und wie, siehe den Abschnitt über das Parsen der Quellgeometrie weiter unten.

  • Die collision_mask filtert, welche physischen Kollisionsobjekte einbezogen werden, wenn der parsed_geometry_type statische Collider enthält.

  • Der source_geometry_mode, der festlegt, auf welchen Nodes das Parsen beginnen soll und wie der SceneTree durchlaufen werden soll.

  • Der source_geometry_group_name wird verwendet, wenn nur eine bestimmte Node-Gruppe geparst werden soll. Hängt vom gewählten source_geometry_mode ab.

Nachdem die Quellgeometrie hinzugefügt wurde, kann das Ergebnis des Backens mit den folgenden Propertys gesteuert werden.

  • Der Parameter cell_size legt die Größe des Rasters fest und sollte mit der Größe der Navigations-Map übereinstimmen.

  • Der agent_radius verkleinert das gebackene Mesh, um genügend Spielraum für die Größe des Agenten (Kollisionen) zu haben.

Das Backen der NavigationRegion2D kann auch zur Laufzeit mit Skripten verwendet werden.

var on_thread: bool = true
bake_navigation_polygon(on_thread)

Zum schnellen Testen des 2D-Backens mit Default-Einstellungen:

  • Fügen Sie ein NavigationRegion2D hinzu.

  • Fügen Sie eine NavigationPolygon-Ressource zur NavigationRegion2D hinzu.

  • Fügen Sie ein Polygon2D unterhalb der NavigationRegion2D ein.

  • Zeichnen Sie 1 NavigationPolygon-Kontur mit dem ausgewählten NavigationRegion2D-Zeichenwerkzeug.

  • Zeichnen Sie 1 Polygon2D-Umriss innerhalb des NavigationPolygon-Umrisses mit dem ausgewählten Polygon2D-Zeichenwerkzeug.

  • Klicken Sie auf den Editor Back-Button und ein Navigations-Mesh sollte erscheinen.

../../_images/nav_region_baking_01.webp ../../_images/nav_mesh_mini_2d.webp

Backen eines Navigations-Meshes mit dem NavigationServer

Die NavigationServer2D und NavigationServer3D haben API-Funktionen, um jeden Schritt des Navigations-Mesh-Backprozesses einzeln aufzurufen.

  • Die Funktion parse_source_geometry_data() kann verwendet werden, um Quellgeometrie in eine wiederverwendbare und serialisierbare Ressource zu zerlegen.

  • Mit bake_from_source_geometry_data() kann ein Navigations-Mesh aus bereits geparsten Daten gebacken werden, um z.B. Performance-Probleme mit (redundantem) Parsing zur Laufzeit zu vermeiden.

  • Die Funktion bake_from_source_geometry_data_async() ist die gleiche, aber sie backt das Navigations-Mesh zeitversetzt mit Threads und blockiert nicht den Hauptthread.

Im Vergleich zu einer NavigationRegion bietet der NavigationServer eine feinere Kontrolle über den Backprozess des Navigations-Meshs. Im Gegenzug ist er komplexer in der Anwendung, bietet aber auch mehr erweiterte Optionen.

Einige weitere Vorteile des NavigationServers gegenüber einer NavigationRegion sind:

  • Der Server kann die Quellgeometrie ohne Backen analysieren, z.B. um sie für eine spätere Verwendung zwischenzuspeichern.

  • Der Server ermöglicht es, den Root-Node auszuwählen, an dem das Parsen der Quellgeometrie manuell gestartet werden soll.

  • Der Server kann prozedural erzeugte Quellgeometriedaten akzeptieren und daraus backen.

  • Der Server kann mehrere Meshes nacheinander backen und dabei dieselben Geometriedaten (wieder)verwenden.

Um Navigationsmeshes mit dem NavigationServer zu backen, ist eine Quellgeometrie erforderlich. Quellgeometrie sind Geometriedaten, die beim Backen von Navigations-Meshes berücksichtigt werden sollten. Sowohl 2D- als auch 3D-Navigations-Meshes werden durch Backen aus der Quellgeometrie erstellt.

2D- und 3D-Versionen der Quellgeometrieressourcen sind als NavigationMeshSourceGeometryData2D bzw. NavigationMeshSourceGeometryData3D verfügbar.

Die Quellgeometrie kann aus visuellen Meshes, aus physikalischen Kollisionen oder aus prozedural erstellten Arrays von Daten wie Umrissen (2D) und Dreiecksflächen (3D) analysiert werden. Der Einfachheit halber wird die Quellgeometrie in der Regel direkt aus Node-Setups im SceneTree geparst. Für das (Neu-)Erstellen von Meshes zur Laufzeit ist zu beachten, dass das Parsen der Geometrie immer auf dem Haupt-Thread stattfindet.

Bemerkung

Der SceneTree ist nicht thread-sicher. Das Parsen der Quellgeometrie aus dem SceneTree kann nur im Haupt-Thread durchgeführt werden.

Warnung

Die Daten von visuellen Meshes und Polygonen müssen von der GPU empfangen werden, was den RenderingServer in diesem Prozess abwürgt. Für das (Neu-)Backen zur Laufzeit sollten bevorzugt Physik-Shapes als geparste Quellgeometrie verwendet werden.

Die Quellgeometrie wird in den Ressourcen gespeichert, so dass die erstellte Geometrie für mehrere Backvorgänge wiederverwendet werden kann. So können z.B. mehrere Navigations-Meshes für unterschiedliche Agentengrößen aus derselben Ausgangsgeometrie erstellt werden. Dies ermöglicht auch das Speichern der Quellgeometrie auf der Festplatte, so dass sie später geladen werden kann, z.B. um den Overhead des erneuten Parsens zur Laufzeit zu vermeiden.

Die Geometriedaten sollten im Allgemeinen sehr einfach gehalten werden. So viele Kanten wie nötig, aber so wenige wie möglich. Besonders in 2D sollte doppelte und verschachtelte Geometrie vermieden werden, da sie die Berechnung von Polygonlöchern erzwingt, was zu gespiegelten Polygonen führen kann. Ein Beispiel für verschachtelte Geometrie wäre ein kleineres StaticBody2D-Shape, das vollständig innerhalb der Grenzen eines anderen StaticBody2D-Shapes platziert wird.

Navigations-Mesh-Blöcke für große Welten backen

Erstellen von Navigationsmesh-Blöcken

Erstellen und Aktualisieren einzelner Navigations-Mesh-Blöcke zur Laufzeit.

Siehe auch

You can see the navigation mesh chunk baking in action in the Navigation Mesh Chunks 2D and Navigation Mesh Chunks 3D demo projects.

Um zu vermeiden, dass die Ränder zwischen verschiedenen Regionsblöcken falsch ausgerichtet sind, verfügen die Navigations-Meshes über zwei wichtige Eigenschaften für den Backprozess des Navigations-Meshes. Die Backgrenze und die Randgröße. Zusammen können sie verwendet werden, um perfekt ausgerichtete Kanten zwischen Regionsblöcken zu gewährleisten.

Navigations-Mesh-Block mit Backgrenze und Randgröße

Navigations-Mesh-Block gebacken mit Backgrenze oder gebacken mit zusätzlicher Randgröße.

Die Backgrenze, bei der es sich um ein achsparalleles Rect2 für 2D und AABB für 3D handelt, schränkt die verwendete Ausgangsgeometrie ein, indem alle Geometrie, die außerhalb der Grenzen liegt, verworfen wird.

Die NavigationPolygon-Propertys baking_rect und baking_rect_offset können verwendet werden, um die 2D-Backgrenze zu erzeugen und zu platzieren.

Die NavigationMesh-Propertys filter_baking_aabb und filter_baking_aabb_offset können verwendet werden, um die 3D-Backgrenze zu erzeugen und zu platzieren.

Wenn nur die Backgrenze gesetzt ist, gibt es immer noch ein weiteres Problem. Das resultierende Navigations-Mesh wird unweigerlich durch notwendige Versätze wie den agent_radius beeinflusst, was dazu führt, dass die Kanten nicht richtig ausgerichtet werden.

Navigations-Mesh-Blöcke mit Lücken

Navigations-Mesh-Blöcke mit auffälligen Lücken aufgrund des Radiusversatzes des gebackenen Agenten.

An dieser Stelle kommt die Property border_size für das Navigations-Mesh ins Spiel. Die Randgröße ist ein nach innen gerichteter Abstand der Backgrenze. Die wichtige Eigenschaft der Randgröße ist, dass sie von den meisten Versätzen und Nachbearbeitungen wie dem agent_radius unbeeinflusst ist.

Anstatt die Ausgangsgeometrie zu verwerfen, verwirft die Randgröße Teile der endgültigen Oberfläche des gebackenen Navigations-Meshes. Wenn die Backgrenze groß genug ist, kann die Randgröße die problematischen Oberflächenteile entfernen, so dass nur die beabsichtigte Blockgröße übrig bleibt.

Navigations-Mesh-Blöcke ohne Lücken

Navigations-Mesh-Blöcke mit ausgerichteten Kanten und ohne Lücken.

Bemerkung

Die Back-Grenzen müssen groß genug sein, um eine angemessene Menge an Quellgeometrie aus allen benachbarten Blöcken einzuschließen.

Warnung

In 3D the functionality of the border size is limited to the xz-axis.