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.
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 :
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):
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.