Passen Sie den Zielwinkel für die Bewegung mit Accelerating Bullet an

7

Also, hier ist mein Problem:

Ich habe einen Turm an einem Schiff angebracht, der sich mit variabler Geschwindigkeit durch meine Spielwelt bewegt und in der Mitte eines anderen Schiffes schießt, das in einem möglicherweise anderen Vektor durch die Spielwelt fährt. Derzeit erhalte ich den Winkel, auf den ich mit atan2 schießen muss:

double targetAngle = Math.Atan2(ship.CurrentTarget.Position.Y - ship.Position.Y, ship.CurrentTarget.Position.X - ship.Position.X);

Dies funktioniert gut, wenn beide Schiffe stationär sind oder sich sehr langsam bewegen, aber wenn sie sich schneller bewegen, bleibt das Ziel zurück. Ein zusätzlicher lustiger Teil des Puzzles: Der Vektor der Kugel ist nicht statisch, sie beginnen bei 0 und erhöhen die Geschwindigkeit. Ihre Position wird wie folgt berechnet:

var direction = new Vector2((float)Math.Cos(currentRotation), 
                (float)Math.Sin(currentRotation));

            if (direction.Length() > 0)
                direction.Normalize();

            var velocity = new Vector2(direction.X * MotionData.CurrentSpeed,
                direction.Y * MotionData.CurrentSpeed) + additiveVector;

Wobei additiveVector der Vektor meines Schiffes zum Zeitpunkt des Abschusses des Projektils ist. CurrentSpeed ​​wird jedem Frame hinzugefügt, bis eine statische Höchstgeschwindigkeit erreicht ist.

Bisher habe ich bei anderen Lösungen zur Kompensation meines Ziels auf Probleme gestoßen, dass die Formeln auf einer statischen Geschwindigkeit für das Projektil beruhen und meine nicht.

Jack
quelle
Ich würde sagen, Sie müssen eine Gleichung aufstellen, die Sie dann lösen müssen. Versuchen Sie, die Funktionen Projektil (t) und Ziel (t) einzurichten. Ptojectile (t) ist abhängig von Ihrem Zielwinkel. Sie haben 2 unbekannte Variablen (Alpha und T). Dann müssen Sie versuchen, mit mathematischen Mitteln eine Lösung zu finden. Beim Einrichten der Projektilfunktion können Probleme auftreten, da diese offensichtlich auf einen Maximalwert beschleunigt wird. Sie könnten versuchen, asymptotisch zu machen, um Ihre Mathematik einfach zu verstehen. Nur etwas zum Nachdenken.
LukeG

Antworten:

1

Ihr Hauptproblem ist, dass Sie zwei Objekte (Schiffe) haben, die sich mit unterschiedlicher Geschwindigkeit bewegen, und ein drittes Objekt, das sich mit der Zeit beschleunigt, und Sie möchten wissen, an welchem ​​Punkt Sie zielen müssen, um das Schiff zu treffen. Mit dieser Frage erhalten Sie die gleiche Frage wie mit militärischen Programmierern - und Sie haben viele Variablen und nie eine 100% ige Chance, den wahren Punkt zu kennen.

Sie brechen es nur auf den beweglichen Teil und schließen Wind, Wellen usw. nicht ein - das macht es einfacher, aber nicht einfach. ^^

Sie haben 5 Variablen in dieser Formel:

  • Schiffswinkel (2) Der Winkel jedes Schiffs kann sich ändern (?) - wenn sie eine Kurve beginnen
  • Schiffsgeschwindigkeit (2) Die Geschwindigkeit jedes Schiffes erhöht sich auf ein Maximum
  • Geschossgeschwindigkeit (1) Die Geschwindigkeit des Geschosses nimmt mit der Zeit zu

Der erste Effekt ist die mögliche Position, um das andere Schiff zu treffen, der letzte ist wichtig zu wissen, wie lange die Kugel über die angegebene Distanz fliegt und wie diesmal der Winkel geändert werden muss.

Um dies zu lösen, haben Sie zwei Möglichkeiten, ich weiß:

1. Tabelle

Die erste Lösung könnte so etwas wie eine Tabelle / Matrix sein, in der Sie mehrere Wertepaare definieren und mit den aktuellen nachschlagen, wie Ihr Winkel sein sollte - dies führt zu einer geringeren Wahrscheinlichkeit, das andere Schiff zu treffen, ist jedoch schnell.

2. Berechnung

Die zweite ist, wie Sie es versucht haben, eine komplexe Formel, um mit allen Parametern den richtigen Zielpunkt zu berechnen.

Einige Ideen dazu:

  1. Ermitteln Sie die aktuelle Entfernung zwischen den beiden Schiffen und die Zeit, die Ihre Kugel benötigt
  2. Berechnen Sie die Geschwindigkeitsdifferenz beider Schiffe, um zu wissen, ob Sie oder das andere Schiff zum Zeitpunkt von Schritt 1 voraus sind. Mit diesen Informationen wissen Sie, ob Sie den Winkel positiv oder negativ einstellen müssen, und Sie wissen, welche Ursache der Schritt hat 1, wie viel Meter der Unterschied sein wird
  3. Ermitteln Sie den Winkel zwischen den beiden Schiffen. Wenn sie nicht parallel sind, müssen Sie den Abstand einstellen, über den Ihre Kugel fliegen muss, damit das andere Schiff näher oder weiter zu Ihnen kommt

Mit diesen Informationen sollten Sie alle Parameter haben, die Ihre Berechnungsanforderungen erfüllen. Mit diesen Informationen können Sie die Koordinate des anderen Schiffs ermitteln, falls Ihre Kugel treffen sollte. Und dann können Sie den Winkel für Ihren Turm / Ihre Kugel auf die angegebenen Koordinaten und nicht auf die aktuelle Position des Schiffes berechnen.

Gummibeer
quelle
+1 für die letzten 3 Punkte, das ist der Kern dessen, was Sie berechnen müssen. Holen Sie sich die Zeit, passen Sie den Winkel basierend auf neuen Positionen an und verwenden Sie diesen neuen Winkel. Sollte perfekt in Ihr System passen.
Premier Bromanov
0

Um die Mathematik hinter @ Gummibeers Antwort zu erweitern ( eine Möglichkeit, die Sie tun könnten ).

Beachten Sie diese physikalische Berechnung

d = vt + 1 / 2at 2
oder
Entfernung = Anfangsgeschwindigkeit * Zeit + 1/2 Beschleunigung * Zeit 2

Angenommen, Ihr Turm befindet sich bei [0,0] und der Feind bei [10,0] und ..
Angenommen, Ihre Kugel startet mit einer Geschwindigkeit von 0 und beschleunigt mit 1 Einheit / Sek. / Sek

Wenn wir darauf abzielen, wo der Feind war, sind das totalDistance10 Einheiten. Nehmen wir auch an, dass unsere accelerationeinfache 1 [Einheit] pro Sekunde und Sekunde ist. ( Ein wichtiger Hinweis ist, alle Entfernungen und alle Zeitrahmen auf derselben Skala zu halten. )

10 = 0 * Zeit + 1/2 1 * Zeit 2 ...
10 = 1/2 * Zeit 2 ...
20 = Zeit 2
Zeit = 4,4721359 Sekunden

Wir wissen jetzt, dass das Ziel so viel Zeit hat, um seine Position zu ändern. Es gibt zahlreiche Strategien, mit denen Sie erraten können, wohin sie sich in diesem Zeitraum bewegen würden. Am einfachsten wäre es, ihre aktuelle Geschwindigkeit zu nehmen, anzunehmen, dass sie mit dieser Geschwindigkeit fortfahren, und diese neue Position neu zu berechnen.

Beachten Sie jedoch, dass es hier ein Paradoxon gibt, das Sie daran hindert, den genauen Zeitpunkt und die Position der Kollision mit dem Ziel zu finden, obwohl Sie sehr nahe kommen können. Durch die Neuberechnung an ihrer neuen Position ändert sich die Zeitberechnung, was bedeutet, dass Sie danach und danach und danach auf ihre angepasste Position neu berechnen können - jede Iteration wird immer präziser, erreicht jedoch nie die vollständigen 100 % Richtigkeit. Dies ist eines der Paradoxe von Zeno - Achilles und die Schildkröte .

DoubleDouble
quelle