Wie würde man ein Navigationsgitter für eine 3D-Welt erzeugen?

11

Ich versuche eine Lösung für dieses Problem zu finden. Ich versuche, ein Navigationsnetz im Format eines Gitters von Eckpunkten zu erstellen, die an x, y-Bodenkoordinaten in Form von Quadraten für den 3D-Raum gebunden sind. Aber ich habe Probleme, einen Weg zu finden, um das zu erreichen.

Ich habe versucht, in die Recast-Bibliothek zu schauen. Es ist eine ziemlich robuste Methode, aber sie verlangsamt sich anscheinend mit größeren Karten und offenem Raum. Ich weiß auch nicht, wie sie mit der Höhenkarte Eckpunkte und Kanten für den Weltraum erzeugen.

Mein nächster Gedanke war, das zu tun, was Unreal Engine 3 früher getan hat.

https://udn.epicgames.com/Three/NavigationMeshReference.html

Welches Raycasts verwenden sollte, um das Netz zu erzeugen. Ich konnte nicht herausfinden, wie ich die Raycasts stoppen sollte.

Also ... meine nächste Option war Box, möglicherweise eine Box-Besetzung. Erstellen Sie ein unterteiltes Volumen mit einer Größe von 2. Richten Sie die Box am Raster aus und schießen Sie rechteckige Prismen als Strahl nach unten. Wenn es auf einem Stück Geometrie landet, das Teil des Bodens ist und das Rechteck nicht geschnitten wird, lassen Sie dort ein Quadrat. Und weiter nach unten, bis die Grenzen des Volumens erreicht sind. Um zu überprüfen, ob Kanten verknüpft werden müssen, könnte ich prüfen, ob die Steigung zwischen zwei Scheitelpunktpaaren innerhalb der begehbaren Steigung liegt, und sie zusammenführen, wenn dies zutrifft.

Meine Hauptprobleme sind ... das scheint nicht sehr optimal zu sein. Ohne darüber nachzudenken, ist der Prozess bei der Schätzung O (N ^ 3) für eine mehrschichtige Ebene. Was ziemlich böse werden kann.

Und das letzte Bit dient zum automatischen Erstellen rechteckiger Gruppen dieser Quadrate. Ich bin mir nicht ganz sicher, wie ich das machen soll. Die unwirkliche Implementierung trennt sie durch Steigungen. Ich versuche jedoch, das Rasterformat beizubehalten. Das ist also nicht unbedingt notwendig. Das Problem besteht weiterhin darin, große rechteckige Kacheln zu erstellen, um den Pfadfindungsprozess in eine Kachelbasis aufzuteilen. Die Fliesen dürfen weder zu groß noch zu klein sein.

Die Fragen sind also ...

Was wäre ein effizienter Weg, um dieses umgürtete Navmesh zu erzeugen? Und was wäre ein guter Weg, um die Fliesen zu erstellen?

MondscheinTheleocat
quelle
Wann erwarten Sie das Netz zu generieren? Kompilierungszeit, Ladezeit oder Echtzeit? Wir hatten mit dem gleichen Problem zu kämpfen und entschieden schließlich, dass es für unser Szenario (Ladezeitgenerierung in einem Top-Down-Shooter ohne überlappende Pfade) übertrieben war. Wir entschieden uns für einen Quad-Tree-basierten Ansatz. Das hat bei uns gut genug funktioniert. Ich denke also, was ich frage ist, brauchen Sie das wirklich oder was ist die einfachste Lösung, die Ihre anfänglichen Anforderungen erfüllt, weil dies eine Zeitersparnis sein kann. Wenn Sie eine gute Lösung schaffen, würde ich gerne hören, wie Sie sie behoben haben.
Niels
@Niels Ich plane, vorab zu bauen und es dann in das Spiel zu laden.
Mondschein
Dann sollte der Zeitaufwand kein allzu großer Nachteil sein, da der Spieler nicht darauf wartet. Sie können jederzeit optimieren, nachdem etwas funktioniert hat.
Niels
Wie groß ist dein Level? Wir haben die Neufassung bei großen Spielen verwendet und hatten kein Problem - Sie müssen nur die Tiie-Werte usw. einstellen
Steven
Ich denke, Sie vermissen das "Gitter" -Bit. Welches ist nicht ganz das gleiche wie die Kacheln, die Neufassung verwendet. Ich versuche herauszufinden, wie man eine Neufassung neu verwendet, um so etwas zu tun. Aber es war größtenteils ein Albtraum.
MoonshineTheleocat

Antworten:

1

Eine grundlegende 3D-Welt könnte durch ein Navigationsnetz dargestellt werden, das in den meisten Spiel-Engines bequem aufgebaut werden kann. Der Akteur kann sich entlang der Kanten von Polygonen bewegen.

Das wäre eine einfache Lösung. Es gibt viele Algorithmen zum Finden und Generieren eines Navigationsnetzes.

Ich möchte etwas mitteilen, das ich vor einiger Zeit gelesen habe.

Beispiel01

Dies beschreibt eine mögliche Lösung, bei der wir unsere Spielwelt in quadratische Kacheln aufteilen können. Immer wenn ein quadratisches Plättchen zum Spiel hinzugefügt wird (wenn sich der Spieler einem Gebiet / prozeduralem Gelände nähert), wird ein quadratisches Plättchen hinzugefügt. Wir müssen jedoch nicht mehr das gesamte Navmesh berechnen. Wir berechnen es einfach für diese Kachel und fügen es dem vorhandenen Diagramm hinzu. Signifikanter Leistungsgewinn dort.

Beispiel 02

Das nächste Problem ist die gezackte Bewegung aus dem vorherigen Beispiel. Ich kann verstehen, dass durch die Betrachtung zukünftiger Kurven und die Verallgemeinerung der Richtung die Zick-Zack-Bewegung stark reduziert und die Bewegung flüssig gemacht wird. Spiele mit detaillierten Animationen geben es nicht preis, aber Sie können dies in einigen Open-World-Spielen feststellen, bei denen ich davon ausgehen würde, dass die Navigation meistens gebacken ist.

Was die Frage betrifft , würde ich Ihnen empfehlen, die Antwort von Kromster zu lesen von Kromster auf einer Liste von Algorithmen zur Erzeugung von Navmesh zu lesen.

Schauen Sie sich auch die KI-Systeme von Left 4 Dead an, zu denen die Beispiele gehören. Viele weitere interessante Themen behandelt

Viel Glück.

suvam0451
quelle
0

Es gibt viele Möglichkeiten, warum man es nicht einfach lokal für den Spieler macht, ein kleines Gitter erstellt, das dem Spieler folgt und unter jeder Kreuzung prüft, ob es übertragbar ist oder nicht, wie es dort einen Boden gibt und einen Strahlwurf macht, um zu sehen, ob es einen gibt eine Mauer / ein Gebäude auf jeder kommenden Seite ..

Joe Shmoe
quelle
Eine gute Idee, aber keine tragfähige für die Endziele. Ich muss eine große Welt unterstützen und der KI erlauben, von einer Seite eines Kontinents zur anderen Seite des Kontinents zu navigieren. Das ist machbar, aber ich müsste ein festes Navigationsraster haben, um die höheren Knoten zu generieren.
Mondschein Theleocat
0

Das ist ein Problem, das ich überall gesehen habe. Der Trick ist "Trennung von Bedenken". "Sag was?", Hörte ich dich denken. Was auf dem Bildschirm angezeigt wird, ist NICHT die "Datenstruktur". Es ist wichtig, die visuellen Elemente von den Daten zu trennen, um die visuellen Elemente zu erstellen. Dies wird Ihr Spiel immer "zukunftssicher" machen, wenn neue zugrunde liegende Softwareversionen veröffentlicht werden.

Erstellen Sie eine Datenstruktur (auch bekannt als: Modell), die Ihre Spielewelt repräsentiert. Erstellen Sie dann eine "Ansicht" des Datenstrukturmodells. Wenn Sie die Welt von einem Schachbrettgitter in ein sechseckiges Gitter ändern möchten, bleibt die Datenstruktur (Modell) dieselbe, aber die Anzeige "malt" (rendert) eine andere Ansicht.

PBMCube
quelle
4
Während das Trennen von Bedenken in der Tat im Allgemeinen eine gute Praxis ist, enthält diese Antwort derzeit nur wenige Details zur Beantwortung der Frage (z. B. wie aus einem bestimmten Satz von Weltgeometrien ein geeignetes gitterbasiertes Pfadfindungsmodell generiert werden kann). Sie haben völlig Recht, dass dieses Modell, unabhängig davon, was es ist, wahrscheinlich von den Daten getrennt sein sollte, die zum Zeichnen der Ebene verwendet wurden. Um jedoch die Frage zu beantworten, benötigen wir noch eine Methode, um dieses Pfadfindungsmodell zu generieren.
DMGregory
-2

Machen Sie ein doppeltes Array. Und wenn ein Objekt / Objekte unpassierbar sind, haben Sie eine Methode, um dem Array mitzuteilen, dass die Position nicht passierbar ist. Wenn eine KI versucht, sich zu bewegen, überprüft sie das doppelte Array und prüft, ob es passierbar ist.

Peter J.
quelle
4
Die Methode zum Auffüllen dieses Arrays ist der schwierige Teil. ;)
DMGregory