Vorhersage der feindlichen Position, damit ein Objekt sein Ziel anführt

13

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!

Kryptisch
quelle
Danke für die Links! Ich bin jedoch der Meinung, dass die Lösungen etwas schwer zu lesen sind. Vielleicht kann ich mithilfe der von Ihnen bereitgestellten Links eine klare visuelle Antwort auf diese Frage finden, um anderen zu helfen, die mit demselben Problem zu kämpfen haben.
Larolaro
@ Larolaro Ich habe meiner Antwort eine grafische Demonstration hinzugefügt, damit Sie sie ein wenig besser verstehen können.
jmacedo
Ich beschreibe den Ansatz , den ich in dieser Antwort nehmen gamedev.stackexchange.com/a/28582/6588
jhocking

Antworten:

3

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:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {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:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

Ausgabe:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

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:

jmacedo
quelle
Ich kann die Bedingungen und Lösungen mit dem Multiplikationszeichen (*) versehen, damit Sie sie leichter in Ihre Programmiersprache portieren können (dann müssten Sie nur ArcTan [...], Sin [...], Weil, [...] Sqrt und schließlich das
Kraftzeichen
Hah, vergiss diese Lösung. Nachdem diese Frage zusammengeführt wurde, enthält der Link der ersten Antwort bessere Antworten.
jmacedo