In meinem 2D-Spiel habe ich KI-Türme, die dem Spieler helfen sollen, indem sie automatisch auf Feinde feuern. Ich möchte, dass sie intelligent schießen und ihr Ziel anführen, anstatt nur die aktuelle Position eines Feindes anzugreifen. Wie kann ich unter Berücksichtigung der (immer konstanten) Geschwindigkeit und des Positionsvektors sowohl des Gegners als auch des Geschosses des Geschosses einen Vektor finden, der die tatsächliche Position darstellt, die das Geschoss anvisieren muss, damit das Geschoss den Gegner schneidet (und trifft)?
Alle Links zu Artikeln, die die Mathematik, Algorithmen usw. beschreiben, wären willkommen!
Antworten:
Diese Frage zu GameDev und diese Frage zu StackOverflow sollten Ihnen die Antwort geben, nach der Sie suchen. :)
quelle
Ich werde Ihnen keine Antwort geben, ich bin sicher, dass dies nützlich oder sogar korrekt ist, aber hier ist es:Nachdem Sie ein wenig mehr mit mathematica gespielt haben (siehe Ende der Antwort für Notizbücher / veröffentlichte Notizbücher), scheint diese Lösung korrekt zu sein, auch wenn sie in Bezug auf die Effizienz möglicherweise nicht die beste ist.
Ich habe das in Mathematica geschrieben, was deinem Problem entspricht. Grundsätzlich löst es die Gleichungen / Ungleichungen, um die OA-Variable, die wir herausfinden müssen. Die Ausgabe gibt uns die möglichen Lösungen an, die OA haben kann, und die Bedingungen, die überprüft werden müssen, damit jede Lösung gültig ist:
{BPx, BPy} ist die aktuelle Position von Blau
{BVx, BVy} ist der Geschwindigkeitsvektor von Blau
{OPx, OPy} ist die Kugelposition von Orange
OV ist die Norm des Geschossgeschwindigkeitsvektors der Orange (Gesamtgeschwindigkeit)
OA ist der Einschusswinkel von Orange (Winkel des Geschwindigkeitsvektors)
t ist die Zeit, die die Kugel benötigt, um blau zu treffen
Ich habe versucht, t> 0 && OV> 0 in die Bedingungen zu setzen, aber Mathematica würde ewig dauern, also habe ich einfach t! = 0 && OV! = 0 verwendet gleiche Position wie Orange und wenn sich die Kugel der Orange wirklich bewegt (anstatt still zu bleiben)
Die Ausgabe ist gigantisch: http://freetexthost.com/xzhhpr5e2w
Wenn wir jedoch die OA == _-Teile extrahieren, erhalten wir Folgendes:
http://freetexthost.com/iyrhqoymfo
Dies sind die Werte, die OA annehmen kann (für die jeweils unterschiedliche Bedingungen gelten müssen).
Mit einer weiteren Analyse der Lösungen, bei denen die OV negativ sein muss, was wir nicht wollen, habe ich Folgendes erhalten:
http://freetexthost.com/iy4wxepeb6
Dies sind also die möglichen Lösungen für das Problem, für die jeweils unterschiedliche Bedingungen gelten müssen. Damit ein bestimmter Winkel OA eine gültige Lösung ist, müssen die folgenden Bedingungen erfüllt sein:
Ausgabe:
Betrachten Sie also nur die Lösungen, bei denen dies bestätigt wird (Sie müssen die Teile nicht überprüfen. Sie geben Ihnen die Zeit, die die Kugel benötigt, um das Fahrzeug zu treffen, wenn die anderen Bedingungen zutreffen. Beachten Sie, dass wenn t ergibt einen negativen Wert, Sie können eine gegebene OA nicht als gültige Lösung betrachten, auch wenn sie die anderen Bedingungen überprüft (dies liegt daran, dass wir t! = 0 anstelle von t> 0 bei der Reduzierung verwendet haben).
Es kann auch eine gute Idee sein, in /math// danach zu fragen .
Bearbeiten
Ich habe ein gewisses Interesse an dieser Frage geweckt und ein kommentiertes Notizbuch mit einer grafischen Demonstration von allem, was ich erklärt habe, erstellt. Hier herunterladen:
http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Oder hier: http://www.2shared.com/file/W01g4sST/towerBullets.html
(Dies ist die veröffentlichte Version, und Sie benötigen nur den Mathematica-Player, den Sie kostenlos sehen können. Wenn Sie kein Mathematica haben, ist dies der richtige Weg.)
Bildschirmfoto:
quelle