Ich habe eine Rakete, die von einem Schiff in einem Winkel abgefeuert wird. Die Rakete dreht sich dann in einem Bogen mit einem vorgegebenen Wenderadius zum Ziel. Wie bestimme ich den Punkt auf dem Bogen, an dem ich anfangen muss, mich zu drehen, damit die Rakete direkt auf das Ziel zusteuert?
BEARBEITEN
Bevor ich die Raketen abschieße, muss ich die Flugwege berechnen und zeichnen. Im angehängten Beispiel hat die Trägerrakete einen Steuerkurs von 90 Grad und die Ziele sind dahinter. Beide Raketen werden mit einem relativen Kurs von -45 Grad oder + 45 Grad zum Kurs der Trägerrakete abgefeuert. Die Raketen wenden sich zunächst mit einem bekannten Wenderadius dem Ziel zu. Ich muss den Punkt berechnen, an dem die Wende die Rakete zum Kurs bringt, an dem sie sich wenden wird, um das Ziel direkt anzugreifen. Befindet sich das Ziel bei oder in der Nähe von 45 Grad, gibt es keine anfängliche Wende, die Rakete geht gerade auf das Ziel zu.
Nach dem Start der Rakete wird auf der Karte auch die Verfolgung der Raketen auf dieser Linie als Angabe der Flugbahn angezeigt.
Ich arbeite an einem Simulator, der die Betriebssoftware nachahmt. Ich muss also die berechnete Flugbahn zeichnen, bevor ich den Start der Rakete zulasse.
In diesem Beispiel befinden sich die Ziele hinter der Trägerrakete, die vorberechneten Pfade werden jedoch gezeichnet.
quelle
Antworten:
Meine Mathematik könnte ein bisschen falsch sein, also habe ich die Antwort herausgesucht.
Ich nehme an, Sie möchten das Szenario der ständigen Zielsuche durchführen - bei dem die Rakete P1, die sich mit einer Geschwindigkeit V1 fortbewegt, ständig versucht, sich dem Spieler P2 zuzuwenden. aber mit einer begrenzten Wendegeschwindigkeit.
Bestimmen Sie den Vektor zwischen dem Spieler und der Rakete.
Verwandle sie in Einheitsvektoren.
Bestimmen Sie den Winkel zwischen den Vektoren.
Begrenzen Sie den Wert des Winkels zwischen ihnen (denken Sie daran, dass Ihre Triggerfunktionen wahrscheinlich mit Bogenmaß arbeiten, versuchen Sie also 0,1 als Drehrate).
Erstellen Sie den neuen Bewegungsvektor.
BEARBEITEN: Dies hat keinen "Ausgangspunkt", da es für das Szenario der kontinuierlichen Referenzfahrt robuster ist (und eine einfachere Implementierung darstellt). Sie müssen keinen Startpunkt für einen Kreis finden - begrenzen Sie einfach die Geschwindigkeit, mit der die Rakete die Richtung ändern kann, und der Rest geschieht aufgrund des Geistes in der Maschine.
quelle
SIGN
in Schritt 4?Ich gehe davon aus, dass Sie die Richtung ändern möchten, indem Sie den Startkurs in den Zielkurs ändern und dann direkt zum Ziel weiterfahren (ein spaßigeres Problem sollte sein, das Ziel beim Wenden zu treffen!).
Ich muss davon ausgehen, dass Sie mit dem gleichen Wenderadius in alle Richtungen abbiegen können (dies ist eine Vereinfachung, die bei echten Raketen schwer zu erkennen ist).
Die einfachste Lösung ist die 90 ° -Biegung : die Raketenfeilen, bis ihre Flugbahn einen rechten Winkel zum Ziel bildet. Wenn Sie genau am 90 ° -Punkt abbiegen, verfehlen Sie das Ziel genau um den Abbiegeradius, da Sie die Abbiegung selbst berücksichtigen müssen. Die Lösung besteht darin, vor Erreichen des 90 ° -Punkts mit der Drehung genau "Wenderadius" Meter (?) Zu beginnen und dann einen 90 ° -Bogen zu formen, um direkt zum Ziel zu gelangen.
Diese Lösung ist nicht immer möglich, wenn Sie beispielsweise auf dem 90 ° -Weg keine Sicht haben (Gebäude oder andere Hindernisse).
Die gute Nachricht ist, dass die Lösung für jeden Winkel (nicht nur für die mythischen 90 °) funktioniert. Der Trick besteht darin, den Raum zu berücksichtigen, der zum Drehen benötigt wird, um mit dem Drehen zu beginnen.
Wie viel früher? Deshalb ist das 90 ° Zeug die einfachste Lösung ...
Nehmen wir an, Sie erreichen die Sichtbarkeit oder die beste Zielposition, wenn der Schusspfad einen Winkel von θ ° bildet. Dann sollten Sie die Abbiegung antizipieren, indem Sie:
... wobei Sekante der Kehrwert des Kosinus ist. Der Beweis ist trivial und wird dem Leser überlassen.
Im Ernst, die Formel stammt aus einer einfachen geometrischen Konstruktion.
Die schwarze Linie ist der Schusspfad, während die dünne schwarze Linie derselbe Pfad ist, der durch Drehen von Radius-Einheiten zum Ziel bewegt wird. das Gleiche gilt für die roten Pfade, die als Ziel dienen.
Die grünen Segmente haben eine Länge von turn_radius, daher sollten Sie Folgendes sehen:
AB ist die Tangente von 90 ° - θ °
BC ist der Sekant.
Die beiden grünen Linien, die vom Wendepunkt kommen, haben eine Länge von turn_radius und verlaufen senkrecht zu den beiden Pfaden. Dies bedeutet, dass der Wenderadius korrekt ist und der Bogen beide Pfade tangiert (wie es auch sein sollte, wenn Sie unter physischen Einschränkungen abbiegen).
Lassen Sie mich wissen, wenn Sie einen Fehler sehen.
BEARBEITEN:
Die Zeichnung, die Sie gepostet haben, zeigt, dass es mehrere Möglichkeiten für den Pfad gibt, auch mit festem Schützen und Ziel, wie Sie hier sehen können:
Sobald das Ziel ausgewählt ist, können Sie das oben Gesagte mit den richtigen Winkeln anwenden.
quelle
Ich würde ein "Lenkverhalten" für die Rakete implementieren. Die Rakete hat: Eine Geschwindigkeit (eine Zahl), eine Position (einen Vektor) und eine (aktuelle) Rotation. Bei jedem Update in Ihrem Spiel / in jedem Frame ändert sich die Rotation der Rakete nur geringfügig (in Richtung des Ziels). Dann wird der Flugkörper entsprechend seiner gegenwärtigen Rotation und gegenwärtigen Geschwindigkeit vorwärtsbewegt.
Funktioniert natürlich für 2D und 3D, da der einzige Unterschied eine zusätzliche Dimension ist.
Eine andere Möglichkeit wäre, den Weg der Rakete vor dem Abfeuern zu berechnen. Sehen Sie Bezier - Kurven oder Spline .
quelle
Ich habe das Gefühl, Sie lösen hier das falsche Problem. Eine reale Rakete macht sich keine Gedanken darüber, wohin sie sich wenden soll. Sie dreht sich einfach, bis sie auf das Ziel gerichtet ist. Die einzige Berechnung, die durchgeführt werden muss, ist, wann die Steuerung wieder auf Neutral gestellt werden muss, da eine reale Rakete ihre Abbiegerate nicht sofort ändern kann. Bei dieser Berechnung wird nur die vom Flugkörper angegebene Fluggeschwindigkeit als Eingabewert verwendet, und ich würde annehmen, dass sie vorberechnet ist.
quelle
Ich denke, der einfachste Algorithmus würde nur zwei Regeln folgen:
Befindet sich das aktuelle Ziel näher an der Rakete als der Drehdurchmesser, fahren Sie geradeaus weiter. Dies vermeidet, dass die Rakete nahe Ziele umkreist, anstatt sie tatsächlich zu erreichen.
Andernfalls drehen Sie sich in Richtung des Ziels, bis Sie darauf zeigen.
So berechnen Sie den Punkt, an dem die Kurve in 2D endet:
An dem Punkt, an dem Sie mit dem Abbiegen beginnen möchten, befindet sich der Mittelpunkt des Abbiegekreises in einem Abstand von Ihrem Abbiegeradius senkrecht zur aktuellen Fahrtrichtung. Beachten Sie, dass es zwei dieser Punkte gibt - Sie möchten wahrscheinlich den Punkt, der Ihrem Ziel am nächsten liegt. Berechnen Sie diese Position und nennen Sie sie P.
Sie können jetzt ein rechtwinkliges Dreieck mit dem rechten Winkel zur Tangente und zwei bekannten Punkten konstruieren - P und Ihr Ziel. Auf diese Weise können Sie die Entfernung von der Tangente zu Ihrem Zielpunkt mit Pythagoras berechnen. Nennen Sie es D.
Nun müssen Sie den Schnittpunkt eines Kreises mit dem Radius D an Ihrem Ziel mit Ihrem Wendekreis berechnen . Sie erhalten zwei Lösungen, die die beiden Tangentenpunkte auf diesem Kreis darstellen, an denen sich die Rakete nicht mehr dreht (eine für jede Fahrtrichtung um den Kreis). Wählen Sie den Punkt vor der Rakete - das ist Ihre Antwort.
quelle