Zielen auf bewegte Gegner: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: ==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 Geg...)
 
K (Kategorisiert)
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:
 
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.
 
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''')
+
  '''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.
 
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 eine eigene funktion dafür geschrieben.
+
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.
  
  '''function''' GetAngleTo('''const''' x,y:real):real;
+
  uses math;
  '''begin'''
+
function WinkelZu(const x,y:real):real;
 +
  begin
 
   ToDo: Add code here
 
   ToDo: Add code here
  '''end''';
+
  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
 +
 
 +
Hinweis, dass bei Netzwerkspielen eine Positionsvorhersage eingesetzt wird mit der man versucht kleine Übertragungshänger zu überbrücken.
 +
 
 +
[[Kategorie:Technik oder Algorithmus]]

Aktuelle Version vom 21. März 2008, 20:59 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.

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

Hinweis, dass bei Netzwerkspielen eine Positionsvorhersage eingesetzt wird mit der man versucht kleine Übertragungshänger zu überbrücken.