Zielen auf bewegte Gegner: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Verwendete Größen und Annahmen)
Zeile 1: Zeile 1:
 +
==Zielen auf unbewegte Gegner==
 +
Hier ist der erwartete Kollisionspunkt die aktuelle Position des Gegners.
 +
In 3D benötigen wir um unseren Schuss in die Richtung des Gegners abzufeuern, einen Vektor in Richtung des Gegners mit Länge 1. Diesen können wir anschließend mit der Geschwindigkeit des Schusses und der Zeitdifferenz multiplizieren um den Schuss zu bewegen.
 +
 +
'''Richtung''':=normalize('''OrtDesGegners'''-'''EigenerOrt''')
 +
 +
In 2D können wir auch mit diesem Vektor arbeiten. Oft will man jedoch auch den Winkel unter dem man den Schuss abfeuern muss.
 +
Also benötigen wir eine Funktion die aus der (x,y)-Position des Gegners, den Winkel zum Gegner errechnet. Dafür ist die Funktion arctan2 aus der unit math geeignet. Da diese den Fall y=0 jedoch nicht korrekt handhabt, habe ich darauf aufbauend eine eigene Funktion dafür geschrieben.
 +
 +
uses math;
 +
function WinkelZu(const x,y:real):real;
 +
begin
 +
  ToDo: Add code here
 +
end;
 +
 +
AngleToEnemy:=WinkelZu('''OrtDesGegners'''.x-'''EigenerOrt'''.x,'''OrtDesGegners'''.y-'''EigenerOrt'''.y)
 +
 +
==Zielen auf bewegte Gegner==
 +
Ein bewegter Gegner bewegt sich jedoch in der Zeit in der der Schuss zu ihm unterwegs ist weiter. Das müssen wir natürlich beim Zielen berücksichtigen.
 +
 
==Zielen auf unbewegte Gegner==
 
==Zielen auf unbewegte Gegner==
 
Hier ist der erwartete Kollisionspunkt die aktuelle Position des Gegners.
 
Hier ist der erwartete Kollisionspunkt die aktuelle Position des Gegners.

Version vom 15. März 2008, 23:09 Uhr

Zielen auf unbewegte Gegner

Hier ist der erwartete Kollisionspunkt die aktuelle Position des Gegners. In 3D benötigen wir um unseren Schuss in die Richtung des Gegners abzufeuern, einen Vektor in Richtung des Gegners mit Länge 1. Diesen können wir anschließend mit der Geschwindigkeit des Schusses und der Zeitdifferenz multiplizieren um den Schuss zu bewegen.

Richtung:=normalize(OrtDesGegners-EigenerOrt)

In 2D können wir auch mit diesem Vektor arbeiten. Oft will man jedoch auch den Winkel unter dem man den Schuss abfeuern muss. Also benötigen wir eine Funktion die aus der (x,y)-Position des Gegners, den Winkel zum Gegner errechnet. Dafür ist die Funktion arctan2 aus der unit math geeignet. Da diese den Fall y=0 jedoch nicht korrekt handhabt, habe ich darauf aufbauend eine eigene Funktion dafür geschrieben.

uses math;
function WinkelZu(const x,y:real):real;
begin
 ToDo: Add code here
end;
AngleToEnemy:=WinkelZu(OrtDesGegners.x-EigenerOrt.x,OrtDesGegners.y-EigenerOrt.y)

Zielen auf bewegte Gegner

Ein bewegter Gegner bewegt sich jedoch in der Zeit in der der Schuss zu ihm unterwegs ist weiter. Das müssen wir natürlich beim Zielen berücksichtigen.

Zielen auf unbewegte Gegner

Hier ist der erwartete Kollisionspunkt die aktuelle Position des Gegners. In 3D benötigen wir um unseren Schuss in die Richtung des Gegners abzufeuern, einen Vektor in Richtung des Gegners mit Länge 1. Diesen können wir anschließend mit der Geschwindigkeit des Schusses und der Zeitdifferenz multiplizieren um den Schuss zu bewegen.

Richtung:=normalize(OrtDesGegners-EigenerOrt)

In 2D können wir auch mit diesem Vektor arbeiten. Oft will man jedoch auch den Winkel unter dem man den Schuss abfeuern muss. Also benötigen wir eine Funktion die aus der (x,y)-Position des Gegners, den Winkel zum Gegner errechnet. Dafür ist die Funktion arctan2 aus der unit math geeignet. Da diese den Fall y=0 jedoch nicht korrekt handhabt, habe ich darauf aufbauend eine eigene Funktion dafür geschrieben.

uses math;
function WinkelZu(const x,y:real):real;
begin
 ToDo: Add code here
end;
AngleToEnemy:=WinkelZu(OrtDesGegners.x-EigenerOrt.x,OrtDesGegners.y-EigenerOrt.y)

Zielen auf bewegte Gegner

Ein bewegter Gegner bewegt sich jedoch in der Zeit in der der Schuss zu ihm unterwegs ist weiter. Das müssen wir natürlich beim Zielen berücksichtigen.

Verwendete Größen und Annahmen

Als erstes nehmen wir an, dass unsere Einheit im Ursprung liegen, also EigenerOrt=0. Dies ist keine Einschränkung, da wir später gegebenfalls den relativen Ort bzw. die relative Geschwindigkeit des Gegners verwenden. Nun nehmen wir noch an, dass unsere Einheit und die gegnerische Einheit punktförmig sind(bzw dass der Schuss aus dem Zentrum unserer Einheit kommt und im Zentrum der gegnerischen Einheit einschlägt).

ToDo: Tabelle erstellen OrtDesGegners : vektorielle Position des Gegners beim abfeuern des Schusses relativ zum Ursprung GeschwindigkeitDesGegners : vektorielle Geschwindigkeit des Gegners GeschwindigkeitDesSchusses : Betrag der Geschwindigkeit an, die ein von uns abgefeuerter Schuss besitzt FlugZeit : Zeit zwischen Abfeuern des Schusses und der Kollision mit dem Gegner Kollisionsort : Ort an dem Schuss und Gegner zusammentreffen. OrtDesGegners(t) : vektorielle Position des Gegners zum Zeitpunkt t

Der Ort an dem sich der Gegner zu einem Zeitpunkt t befindet errechnet sich zu: OrtDesGegners(t)=OrtDesGegners+GeschwindigkeitDesGegners*t