Ich erstelle ein 2D-Weltraumspiel und muss dafür sorgen, dass das Raumschiff einen Planeten abfängt. Ich habe Arbeitscode für geradlinige Abschnitte, kann aber nicht herausfinden, wie die Position der Planeten auf einer kreisförmigen Umlaufbahn berechnet wird.
Das Spiel ist wissenschaftlich nicht korrekt, daher mache ich mir keine Sorgen um Trägheit, Schwerkraft, elliptische Bahnen usw.
Ich kenne den Ort und die Geschwindigkeit der Raumschiffe sowie die Umlaufbahn (Radius) und die Geschwindigkeit der Planeten
2d
mathematics
physics
Ausa
quelle
quelle
Antworten:
Eine analytische Lösung hierfür ist schwierig, aber wir können die binäre Suche verwenden , um eine Lösung mit der erforderlichen Genauigkeit zu finden.
Das Schiff kann zum Zeitpunkt t_min den nächstgelegenen Punkt auf der Umlaufbahn erreichen :
Das Schiff kann JEDEN Zeitpunkt auf der Umlaufbahn erreichen, der kürzer oder gleich t_max ist :
(Der Einfachheit halber gehe ich hier davon aus, dass das Schiff durch die Sonne fahren kann. Wenn Sie dies vermeiden möchten, müssen Sie zumindest in einigen Fällen auf nicht geradlinige Pfade umsteigen. "Kusskreise" sehen möglicherweise gut aus und befinden sich in einer Umlaufbahn Mechanik-y, ohne den Algorithmus um mehr als einen konstanten Faktor zu verändern)
Wenn unsere Umlaufzeit kurz ist, können wir diese Obergrenze möglicherweise verbessern, indem
t_max
wir das erste Mal wählen , wenn sicht_min
der Planet der Startposition des Schiffes am nächsten nähert. Nehmen Sie, welcher dieser beiden Wertet_max
kleiner ist. In dieser späteren Antwort erfahren Sie, warum dies funktioniert.Jetzt können wir die binäre Suche zwischen diesen Extremen t_min und t_max verwenden . Wir werden nach einem t-Wert suchen, der den Fehler nahe Null bringt :
(Bei dieser Konstruktion sind error @ t_min> = 0 und error @ t_max <= 0, sodass für einen t-Wert dazwischen mindestens ein Abschnitt mit error = 0 vorhanden sein muss.)
wobei der Vollständigkeit halber die Positionsfunktion so etwas wie ... ist
Wenn die Umlaufzeit des Planeten im Vergleich zur Schiffsgeschwindigkeit sehr kurz ist, kann diese Fehlerfunktion über die Zeitspanne von t_min bis t_max das Vorzeichen mehrmals ändern. Behalte einfach das früheste + ve & -ve-Paar im Auge und suche weiter zwischen ihnen, bis der Fehler nahe genug bei Null liegt ("nahe genug", abhängig von deinen Einheiten und dem Gameplay-Kontext). Das Quadrat der halben Frame-Dauer kann gut funktionieren - das stellt sicher, dass das Abfangen innerhalb eines Frames genau ist)
Sobald Sie ein nettes Fehler minimierendes t haben, können Sie das Schiff einfach auf planet.positionAtTime (t) richten und Vollgas geben, in der Gewissheit, dass der Planet diesen Punkt zur gleichen Zeit erreicht, zu der Sie dies tun.
Sie finden immer eine Lösung in den Iterationen Log_2 ((2 * orbitRadius / ship.maxSpeed) / errorThreshold). Wenn mein Schiff zum Beispiel die Umlaufbahn in 60 Bildern überqueren kann und ich einen Schnitt mit einer Genauigkeit von bis zu einem Bild will, benötige ich ungefähr 6 Iterationen.
quelle
Lassen Sie uns dies nicht überkomplizieren. Dies ist keine "perfekte" Lösung, sollte aber für die meisten Spiele funktionieren und jegliche Unvollkommenheit sollte für den Spieler unsichtbar sein.
Dies funktioniert, weil der Fehler umso geringer wird, je näher das Raumschiff kommt. So wird die Berechnung mit der Zeit stabiler.
Der Fehler ist die Differenz zwischen der berechneten Zeit, die benötigt wird, um den Planeten zu erreichen (TimeNeeded) und der tatsächlichen Zeit, die benötigt wird, um den Planeten zu erreichen (nach Berücksichtigung des neuen Zielpunkts).
quelle
Beginnen wir mit einem Blick auf die Mathematik hinter dem Problem.
Schritt 1:
Um den Schnittpunkt zwischen einer Linie und einer Form zu finden, müssen Sie lediglich die Gleichung der Linie in die Gleichung der Form einfügen, die in diesem Fall ein Kreis ist.
Nehmen Sie einen Kreis mit Mittelpunkt c und Radius r . Ein Punkt p liegt auf dem Kreis, wenn
Der quadratische Abstand kann als Punktprodukt ( http://en.wikipedia.org/wiki/Dot_product ) umgeschrieben werden .
Das ist eine einfache quadratische Gleichung, und wir kommen zur Lösung
Schritt 2:
Was können wir damit machen? Nun, wir wissen jetzt, wie weit das Schiff zurücklegen muss und wo es landen wird!
Jetzt müssen Sie nur noch berechnen, wo sich der Planet befinden soll, wenn das Schiff in Richtung seiner Umlaufbahn fährt. Dies lässt sich leicht mit sogenannten Polar Coodinates ( http://mathworld.wolfram.com/PolarCoordinates.html ) berechnen.
Zusammenfassung
Wählen Sie eine Linie für Ihr Schiff und führen Sie die Berechnung aus, um festzustellen, ob sie mit der Planetenbahn kollidiert. Wenn ja, berechnen Sie die Zeit, die benötigt wird, um zu diesem Punkt zu gelangen. Verwenden Sie diese Zeit, um von diesem Punkt aus mit dem Planeten in die Umlaufbahn zurückzukehren und zu berechnen, wo sich der Planet befinden soll, wenn das Schiff in Bewegung gerät.
quelle
Hier sind zwei "out of the box" -Lösungen.
Die Frage ist: Wenn sich das Schiff mit einer bestimmten Geschwindigkeit auf einer geraden Linie bewegt und sich der Planet mit einer bestimmten Winkelgeschwindigkeit in einem Kreis mit einem bestimmten Radius bewegt, bestimmen die Startpositionen von Planet und Schiff, welchen Richtungsvektor das Schiff hat Es sollte eine gerade Linie sein, um einen Abfangkurs zu zeichnen.
Lösung eins: Leugnen Sie die Prämisse der Frage. Die Größe, die in der Frage "rutschbar" ist, ist der Winkel. Korrigieren Sie das stattdessen. Richten Sie das Schiff direkt in die Mitte der Umlaufbahn.
Lösung 2: Machen Sie das überhaupt nicht mit dem Autopiloten. Erstelle ein Minispiel, in dem der Spieler mit Triebwerken auf den Planeten zukommen muss. Wenn sie ihn mit zu hoher Relativgeschwindigkeit treffen, explodieren sie, aber der Treibstoff ist begrenzt. Lassen Sie den Spieler lernen, das Abfangproblem zu lösen!
quelle
Die Position des Planeten in Raum und Zeit kann z
Diese Gleichung muss numerisch gelöst werden. Es kann viele Lösungen geben. Wenn man es betrachtet, scheint es immer eine Lösung zu geben
quelle
Hier ist ein Teil einer Lösung. Ich habe es nicht rechtzeitig geschafft. Ich werde es später noch einmal versuchen.
Wenn ich das richtig verstehe, haben Sie die Position und Geschwindigkeit eines Planeten sowie die Position und Geschwindigkeit eines Schiffes. Sie möchten die Bewegungsrichtung des Schiffes ermitteln. Ich gehe davon aus, dass die Geschwindigkeit von Schiff und Planet konstant ist. Ich gehe auch ohne Einschränkung der Allgemeinheit davon aus, dass sich das Schiff bei (0,0) befindet; Dazu subtrahieren Sie die Schiffsposition vom Planeten und addieren die Schiffsposition wieder zum Ergebnis der unten beschriebenen Operation.
Leider kann ich diese Antwort ohne Latex nicht sehr gut formatieren, aber wir werden versuchen, dies zu erreichen. Lassen:
s_s
= die Schiffsgeschwindigkeit (s_s.x, s_s.y, ebenfalls)s_a
= die Schiffspeilung (Bewegungswinkel, was wir berechnen wollen )p_p
= die ursprüngliche Position des Planeten, globale Koordinatenp_r
= Entfernung (Radius) des Planeten vom Mittelpunkt der Umlaufbahn, ableitbar vonp_p
p_a
= der Anfangswinkel des Planeten im Bogenmaß relativ zum Mittelpunkt der Umlaufbahnp_s
= Winkelgeschwindigkeit des Planeten (rad / sec)t
= die Zeit bis zur Kollision (dies ist etwas, das wir ebenfalls berechnen müssen)Hier sind die Gleichungen für die Position der beiden Körper, unterteilt in Komponenten:
Da wir wollen
ship.x = planet.x
undship.y = planet.y
irgendwannt
erhalten wir diese Gleichung (dery
Fall ist fast symmetrisch):Lösen der Top-Gleichung für s_a:
Das Einsetzen in die zweite Gleichung führt zu einer ziemlich erschreckenden Gleichung, die Wolfram Alpha für mich nicht lösen wird . Möglicherweise gibt es einen besseren Weg, dies ohne Polarkoordinaten zu tun. Wenn jemand diese Methode ausprobieren möchte, ist er herzlich eingeladen. Ich habe dies zu einem Wiki gemacht. Andernfalls möchten Sie dies möglicherweise zum Math StackExchange übertragen .
quelle
Ich würde die Stelle festlegen, an der abgefangen werden soll (streife den Kreis auf der "ausgehenden" Seite der Umlaufbahn).
Jetzt müssen Sie nur noch die Geschwindigkeit des Raumschiffs anpassen, damit Planet und Schiff gleichzeitig diesen Punkt erreichen.
Beachten Sie, dass das Rendezvous nach N weiteren Umlaufbahnen stattfinden kann, je nachdem, wie weit das Schiff entfernt ist und wie schnell der Planet den Stern umkreist.
Wählen Sie das N, das der Reisedauer des Schiffes bei der aktuellen Geschwindigkeit am nächsten kommt.
Beschleunigen oder verlangsamen Sie dann das Schiff, um den Zeitstempel für diese N Umlaufbahnen exakt abzugleichen.
Dabei ist der aktuelle Verlauf bereits bekannt! Nur nicht die Geschwindigkeit.
quelle