Berechnung der Mindestgeschwindigkeit des Projektils, die erforderlich ist, um das Ziel im Parabelbogen zu treffen


Antworten:


15

Die parabolische Trayectory-Funktion ist definiert als:

   Fx = Vox*t + Ox;
   Fy = -0.5 * g * t * t + Voy*t + Oy;      
  • Bekannte Werte:

    P: the target point.
    O: the origin point.
    g: gravity.
    t: time needed to impact.
  • Unbekannte Werte:

    Vo: Initial Velocity
  • Um 'Vo' zu berechnen, können wir der F-Funktion Werte zuweisen:

    't' = flight time  'duration' 
    'F' = target point 'P'        
    
          (Px-Ox)
    Vox = --------
          duration
    
          Py + 0.5* g * duration * duration - Oy 
    Voy = ---------------------------------------
                     duration
  • Sie können nun alle Werte abrufen, um das Ziel vom Ursprung aus zu erreichen, und Werte für t in die F-Gleichung eingeben:

     When t = 0         => F == O (Origin)
     When t = duration  => F == P (Target)      

gute Antwort. merke nur, dass g nicht signiert ist. wenn g zunimmt, sollte auch Voy zunehmen.
milkplus

Wie ist t (Zeit bis zum Aufprall) bekannt?
Dewald Swanepoel

13

Vor kurzem musste ich ein ähnliches Problem lösen. Ich fand zwei Lösungen, die auf der Formel basieren, die ich auf der Wikipedia-Seite 'Dan the Man' gefunden habe, die bereits erwähnt wurde: Flugbahn eines Projektils

Bei dieser Lösung müssen Sie entweder den Startwinkel fest oder die x-Geschwindigkeit eingeben. Eine Y-Geschwindigkeit ist nicht erforderlich, da das Projektil in einem bestimmten Winkel abgefeuert wird.

Lösung 1, Startwinkel ist festgelegt, Geschwindigkeit berechnen:

g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity

Lösung 2, Geschwindigkeit ist fest, Startwinkel berechnen:

g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle

In meinem Fall hat diese Lösung ganz gut funktioniert.


2

Wenn es Sie nicht interessiert, ob es mathematisch korrekt ist, nur dass es korrekt genug aussieht, berechnen Sie den geraden Pfad und lassen Sie Ihr Projektil diesem Pfad folgen, aber "schieben Sie es nach oben" entlang der Normalen dieser Linie als Funktion der Entfernung nach unten Das Liniensegment steigt an, wenn es sich der Mitte des Segments nähert, und fällt ab, wenn es sich von der Mitte des Liniensegments entfernt.

Sie können hierfür eine Sinuswelle verwenden und den Gradbereich von -90 bis +90 verwenden (wobei -90 der linke Punkt auf dem Liniensegment ist, 90 der rechte Punkt und Sie in der Mitte lerpen) und das Ergebnis multiplizieren durch eine Konstante, um es zu vergrößern.

Wenn Sie die rein korrekte mathematisch / physikalische Antwort benötigen, hilft dies nicht. Wenn Sie dies nicht tun, kann dies wahrscheinlich ziemlich gut für Sie funktionieren!

Vergessen Sie nicht, bei der Programmierung von Spielen geht es darum, Illusionen zu verwenden, die korrekt aussehen (und billiger zu berechnen sind), anstatt um Realismus.


7
Betreff: "Verwenden von Illusionen, die korrekt aussehen (und billiger zu berechnen sind)", stimme ich im Allgemeinen zu, aber in diesem Fall erscheint das irgendwie albern, wenn man bedenkt, wie einfach und billig es ist, den mathematisch korrekten Parabelbogen zu verwenden.
Nathan Reed

1
Dies scheint zwar eine unnötige Vereinfachung zu sein, aber ich denke nicht, dass diese Antwort im schlechten Sinne schlecht ist und die Abwertung nicht verdient (auch wenn sie nicht viele Aufwertungen verdient).
Wird

Wenn Sie eine Sinuswelle verwenden, sollte diese 0 bis 180 (oder 0 bis Pi im Bogenmaß) betragen
Daniel Kaplan,

2

Wenn Sie nur etwas brauchen, das in etwa richtig ist und eine feste Geschwindigkeit hat, können Sie diese sehr vereinfachte Methode verwenden.

distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;

Die Entfernung kann negativ sein, funktioniert aber trotzdem, da der Winkel auch von der Entfernung abhängt. Wenn der Abstand negativ ist, ist der Winkel, der hinzugefügt werden muss, ebenfalls negativ.

Sie müssen mit distanceFactor herumspielen, um den richtigen Wert zu finden. Es hängt von der Schwerkraft und der Kraft des Projektils ab. Sie sollte in der Nähe von 1 liegen, geteilt durch die maximale Entfernung, die das Projektil zurücklegen kann.


1
Kopf hoch. Als ich deinen Code ausprobierte, hattest du Lattich und Sünde rückwärts. Ich habe Ihren Code so bearbeitet, dass er korrekt sein sollte.
MrValdez
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.