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.
Antworten:
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:
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:
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.
quelle
Um die Mathematik hinter @ Gummibeers Antwort zu erweitern ( eine Möglichkeit, die Sie tun könnten ).
Beachten Sie diese physikalische Berechnung
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
totalDistance
10 Einheiten. Nehmen wir auch an, dass unsereacceleration
einfache 1 [Einheit] pro Sekunde und Sekunde ist. ( Ein wichtiger Hinweis ist, alle Entfernungen und alle Zeitrahmen auf derselben Skala zu halten. )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 .
quelle