3D-Kollisionsvermeidung: Ermitteln des aktualisierten Geschwindigkeitsvektors (außerhalb der Kegel „Kollisionsgeschwindigkeiten“)

8

Ich versuche, den Mechanismus eines vollständig 3D-Systems zur Vermeidung von Kollisionen (Lenkverhalten) für Flugbewegungen (sechs Freiheitsgrade) zu verstehen und umzusetzen, wobei ich mich derzeit auf die Umgehung statischer Hindernisse (alle mit der Form einer Kugel) konzentriere.

Ich verstehe jedoch nicht ganz, wie ich den neuen Geschwindigkeitsvektor des sich bewegenden Agenten herausfinden soll. Die folgende Abbildung zeigt die Szene. Das sich bewegende Mittel (grün) muss drei statische Objekte (blau) steuern. Die rote Linie repräsentiert den anfänglichen Vorwärtsgeschwindigkeitsvektor.

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass es auch drei weiße / halbtransparente Kegel gibt. Diese repräsentieren die "verbotenen Geschwindigkeitsvektoren" für jedes Hindernis. Dies bedeutet, dass der Satz von Geschwindigkeitsvektoren, wenn er als neue Vorausvektoren des Agenten verwendet wird, den Agenten mit einem oder mehreren der Hindernisse kollidieren lässt (beachten Sie auch, dass der Radius jedes Kegels gleich dem Radius des gegebenen Hindernisses ist plus den Radius des Agenten, damit der Spieler einen Versatz zum Manövrieren hat).

Um den neuen Vorausvektor des sich bewegenden Agenten in einer solchen 3D-Umgebung unter Berücksichtigung der drei Hindernisse herauszufinden, wäre es ein naiver Ansatz, einfach die klassische Lösung, die in diesem oft zitierten Artikel erläutert und anhand des folgenden 2D-Bildes veranschaulicht wird, auf 3D zu portieren :

Geben Sie hier die Bildbeschreibung ein

Dort wird eine neue Geschwindigkeit (orangefarbener Pfeil) einfach berechnet, indem der Mindestabstand (schwarzer Pfeil) zwischen der ursprünglichen Geschwindigkeit und der Mitte des Hindernisses normalisiert und diese Normalen dann mit der Summe zwischen dem Radius des Hindernisses und dem Radius des Hindernisses multipliziert werden Umzugsmittel. Dann würde ein Durchschnitt der neuen Geschwindigkeiten, die für jedes der Hindernisse berechnet wurden, die Gesamtendgeschwindigkeit ergeben.

In vielen Fällen reicht das aus. Schauen Sie sich jedoch die folgenden Fälle an (zur Vereinfachung der Visualisierung in 2D dargestellt):

Geben Sie hier die Bildbeschreibung ein

In allen Fällen führt der naive Ansatz zu einer Kollision. In a und b stimmt die endgültige neue Geschwindigkeit mit der ursprünglichen Geschwindigkeit überein (roter Pfeil), und das sich bewegende Mittel bewegt sich vorwärts, obwohl es teilweise oder vollständig blockiert ist. In c) und d) führt die neue Geschwindigkeit (orangefarbener Pfeil) immer noch zur gleichen Konsequenz.

Meine Frage lautet also: Was ist der rechnerisch effizienteste Weg, um den neuen Vorausvektor des sich bewegenden Agenten in einer solchen 3D-Umgebung unter Berücksichtigung der drei Hindernisse so herauszufinden, dass Kollisionen vermieden werden? Oder mit anderen Worten, der neue Vorausvektor, der:

1) befindet sich nicht in einem der Zapfen;

2) ist dem ursprünglichen Vorwärtsvektor am nächsten (rote Linie im Bild).

PS: Am liebsten suche ich keine Bibliothek, ich möchte lernen, wie das geht.

Louis15
quelle

Antworten:

1

Ich glaube nicht, dass es einen effizienten Weg gibt, das Problem genau zu lösen, aber hier ist, wie ich versuchen würde, es anzugehen.

Zuerst würde ich Begrenzungsvolumina um jedes Objekt anstelle der Objekte selbst verwenden. Jedes Objekt kann jedoch durch die Vereinigung von mehr als einem Begrenzungsvolumen angenähert werden.

Die einfachste Lösung wäre, ein einzelnes Begrenzungsvolumen zu berechnen, das alle Objekte enthält, die Sie vermeiden müssen, und den Kegel aus diesem Volumen zu berechnen.

Dies ist möglicherweise nicht gut genug, wenn Objekte nicht relativ nahe beieinander liegen. Möglicherweise möchten Sie dann ein Clustering so durchführen, dass zwei Objekte zum selben Cluster gehören, wenn dies nicht möglich oder zumindest nicht trivial ist, um zwischen ihnen zu wechseln. Berechnen Sie die Gruppe von Objekten unter Berücksichtigung ihres Begrenzungsvolumens plus der Größe des Begrenzungsvolumens des Spielers plus eines zusätzlichen Spielraums. Sie könnten so etwas verwenden:

http://lab.polygonal.de/?p=120

Nachdem Sie die Cluster gefunden haben, suchen Sie den nächstgelegenen und berechnen Sie den Kegel, um eine Kollision mit ihm zu vermeiden. Aufgrund der Art und Weise, wie die Cluster erstellt wurden, werden Sie keinen anderen treffen, wenn Sie gerade genug steuern, um nicht auf einen Cluster zu treffen.

Darüber hinaus können Sie bei der Berechnung der Cluster eine rekursive Struktur erstellen, mit deren Hilfe Sie den nächstgelegenen Cluster finden.

Es gibt ein paar Dinge, mit denen Sie spielen können. Anstatt beispielsweise den nächstgelegenen Cluster auszuwählen, wählen Sie die beiden nächstgelegenen Cluster aus und berechnen Sie einen einzelnen Kegel, der beide vermeidet. Sie können auch andere Begrenzungsvolumina als Kugeln ausprobieren.

Gato
quelle
0

Es gibt zwei Möglichkeiten, diese Frage zu beantworten, die ich sehen kann. Wenn Sie einfach nur einen Weg finden möchten, um zu steuern, müssen Sie nur die Pfadfindung implementieren ( ich finde das sehr hilfreich ). Das wäre das Ende davon (und ist die richtige praktische Antwort auf diese Frage), aber ich denke, Sie sind neugieriger auf eine mathematische Lösung Ihres Problems.

Um dies zu beheben, schauen wir uns ein gleichwertiges Problem an. Nehmen Sie ein 2D-Stück Ihrer Szene "vor" Ihrem Piloten eines Flugzeugs, das normal zum ursprünglichen Vektor ist. Sie erhalten einen Punkt, der Ihren ursprünglichen Vektor darstellt, und eine Reihe von Ellipsen, die die 2D-Projektionen Ihrer Okklusionskegel darstellen. Was Sie jetzt tun möchten, ist, den Punkt zu finden, der Ihrem ursprünglichen Punkt am nächsten liegt (nennen wir ihn P) und der außerhalb von nicht überlappenden Ellipsen liegt. Es stellt sich heraus, dass dies ein ziemlich schwer zu lösendes Problem ist. Es gibt 3 Schritte:

  • Finden Sie die Schnittpunkte aller Ihrer Ellipsen heraus
  • Finden Sie alle Löcher in der Vereinigung aller Ihrer Ellipsen
  • Finden Sie den nächstgelegenen Punkt Pauf allen Ellipsen außerhalb der Verbindung heraus (der sich innerhalb eines Lochs befinden kann).

Okay, all dies erfordert Lagrange-Multiplikatoren und Winkelprüfungen und einige andere wirklich komplizierte Dinge, um sie zu lösen. Schauen wir uns andere Optionen an. Wenn wir unser Problem stattdessen in einen Winkelraum umwandeln, sehen wir, dass wir tatsächlich den Mindestabstand zwischen einem Punkt und mehreren Kreisen ermitteln möchten, die auf die Oberfläche einer Kugel projiziert werden. In der Differentialgeometrie wird dies oft als 2-Kugel bezeichnet und ist hier nützlich. Also müssen wir zuerst den Abstand zwischen zwei Punkten auf der Oberfläche der Kugel ermitteln, den wir anhand der 2-Kugel-Metrik ermitteln. Zum Glück ist es ziemlich einfach: ds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2)Wo wir Rkonstant halten, wie der Radius unserer 2-Kugel in den 3-Raum projiziert. Ich komme aus der Physik und nehme thden Winkel vom Positiven zund phden Winkel vom Positiven xmitsdie Entfernung sein.

Was bringt das? Es ermöglicht uns, die Verwendung von Lagrange-Multiplikatoren zu entfernen, um die Entfernung zu minimieren, und ermöglicht es uns, in "nativen" Koordinaten zu arbeiten (da wir unsere Kegel in Bezug auf einen Okklusionswinkel definieren). Jetzt müssen wir den Radius unserer Kegelprojektionen finden. Nehmen wir zunächst einen Kegel und nennen den Winkel, der ihn definiert a. Der Radius der Projektion ist dann einfach R*a. Das war einfach genug - welche andere Menge müssen wir über die Zapfen wissen? Wir müssen das Zentrum der Projektion kennen, das durch den Look-Vektor des Schauspielers definiert wird. Zuerst haben wir konvertieren x, yund zin sphärischen Koordinaten , wo wir wissen , dass wir in der Entfernung sind R, und lösen für thund ph, was wir durch einfaches Einstecken in unsere Umrechnungsformeln tun können:th = acos(z/R)und ph = atan2(y/x)( atan2hier verwenden, um die Quadrantenmehrdeutigkeiten des Arkustangens zu berücksichtigen). Der Vorgang ist der gleiche, um die Position Ihres ursprünglichen Vektors in sphärischen Koordinaten zu ermitteln.

Das Problem wurde also vereinfacht. Das Problem ist jedoch immer noch schwer zu lösen, aber jetzt müssen Sie sich nur noch um Kreise und Punkte kümmern, anstatt um Ellipsen und Punkte oder Winkel und Vektoren. Der Rest des Prozesses ist eher prozedural. Sie müssen im Wesentlichen einen durch Ihre Kreise gebildeten Begrenzungsbereich finden, für den es mehrere Lösungen gibt. Ich werde eine Methode vorstellen, die vielleicht nicht die beste ist, aber funktioniert.

Ich würde zuerst die Summe der Radien aller Kreispaare und den Abstand zwischen den Zentren vergleichen und dann, wenn ihre Summe größer als der Achsabstand ist, sie gleich setzen und nach thund auflösenphum die Kreuzungen zu finden. Sie wissen, dass jedes Schnittpunktpaar "verbotene Winkel" für den betreffenden Kreis beschreibt, die Sie als Array von Schnittpunktwinkeln (vom Mittelpunkt des Kreises) für jeden Kreis speichern würden, der diesen schneidet - wichtig ist, dass Sie " Zusammenführen "aller Bereiche, die sich überschneiden, wenn Sie sie dem Array hinzufügen, damit der nächste Teil ordnungsgemäß funktioniert. Dann finden Sie den Punkt am Rand des Kreises, der dem ursprünglichen Punkt am nächsten liegt (dies ist so einfach wie das Zeichnen einer Linie durch den Mittelpunkt des Kreises und den ursprünglichen Punkt und dann die Position auf der Linie im Radius des Kreises vom Zentrum entfernt). Durchlaufen Sie dann Ihr gespeichertes Array und testen Sie, ob dieser Winkel im Bereich jedes verbotenen Winkels liegt. Wenn ja, wählen Sie die nächstgelegene Kante aus. Dies ist der Punkt, der der in diesem Kreis beschriebenen Außenseite am nächsten liegt. Wiederholen Sie den Vorgang für alle Kreise (einige Optimierungen können im Auswahlprozess vorgenommen werden - Sie müssen dies nicht für jeden Kreis berechnen). Vergleichen Sie nun alle Ihre kürzesten Entfernungen, finden Sie die kleinste und das ist Ihre Antwort, die in den Winkeln beschrieben wirdthund ph. Denken Sie daran, dass die Entfernung bei dieser Berechnung mit der 2-Kugel-Metrik beschrieben wird. Da Sie sich nicht für die Kugel interessieren, auf der sich all dies befindet, sondern nur für die Winkel, können R=1Sie diese Berechnungen für die Einheitskugel festlegen und durchführen.

Dies ist der einfachste Weg, den ich mir vorstellen kann. Ich bin mir nicht sicher, ob es der absolut einfachste Weg ist, aber es würde ziemlich gut funktionieren. Praktisch für ein Spiel möchten Sie jedoch nur die Pfadfindung implementieren.

dannuic
quelle