Hinzufügen von Luftwiderstand zu einer Golfball-Flugbahngleichung


10

Ich entwickle ein 2D-Golfspiel in VB.NET 2005, aber ich bin nicht sicher, wie ich Luft- oder Windwiderstand implementieren soll, der den Ball beeinflussen soll.

Ich habe bereits diese Gleichungen für Projektil:

  • für die Anfangsgeschwindigkeit eines Golfballs beim Schlagen oder Abfeuernv0
  • Vertikale und horizontale Komponenten die Geschwindigkeit des Golfballs:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Vertikaler und horizontaler Abstand des Golfballs:

    x=v0cos(θ)ty=v0sin(θ)t(0.5)gt2

Wie füge ich dieser Gleichung Luftwiderstand hinzu, um die Geschwindigkeit des Golfballs richtig zu beeinflussen? Ich habe keine Ahnung, wie es geht. Hat jemand mit ähnlichen Gleichungen gearbeitet?

Antworten:


10

Ich bin mir nicht sicher, ob es überhaupt eine geschlossene Form für Luftwiderstand oder Wind gibt, aber es ist ziemlich einfach, schrittweise zu simulieren (wie es alle Physikbibliotheken tun):

  1. Stellen Sie Ihren Ausgangszustand ein:

    x,y,vx,vy(for t=0)
  2. Position aktualisieren:

    x=x+(vx×dt)y=x+(vy×dt)

    (wobei dt die seit dem letzten Update verstrichene Zeit ist, auch bekannt als Delta-Zeit)

  3. Berechnen Sie diese Geschwindigkeitshelfer:

    v2=(vx)2+(vy)2|v|=v2

    |v|v

  4. Widerstandskraft berechnen:

    fdrag=c×v2

    (wobei c der kleine Reibungskoeffizient ist ! )

  5. Kräfte ansammeln:

    fx=(fdrag×vx|v|)fy=(fdrag×vy|v|)+(g×mass)

    mass

  6. Aktualisierungsgeschwindigkeit:

    vx=vx+fx×dtmassvy=vy+fy×dtmass

Das ist im Grunde Eulers Methode zur Annäherung dieser Physik.


Ein bisschen mehr darüber, wie die Simulation in den Kommentaren angefordert wurde:

  • (t=0)

x=0y=0vx=v0×cos(θ)vy=v0×sin(θ)

Es ist im Grunde dasselbe wie in Ihrer grundlegenden Trajektorienformel, bei der jedes Auftreten von t durch 0 ersetzt wird.

  • KE=0.5m(V2)tv2

  • PE=m×g×y

  • (x,y)t1t=0t=t1

  • (x,y)t1t2t1<t2t1t2

Pseudocode:

simulate(v0, theta, t1)
  dt = 0.1
  x = 0
  y = 0
  vx = v0 * cos(theta)
  vy = v0 * sin(theta)
  for (t = 0; t < t1; t += dt)
    x += vx * dt
    y += vy * dt
    v_squared = vx * vx + vy * vy
    v_length = sqrt(v_squared)
    f_drag = c * v_squared
    f_grav = g * mass
    f_x = (-f_drag * vx / v_length)
    f_y = (-f_drag * vy / v_length) + (-f_grav)
    v_x += f_x * dt / mass
    v_y += f_y * dt / mass
  end for
  return x, y
end simulate

Vielen Dank dafür, ich werde es ausprobieren und mich bei Ihnen melden.
Smith

Aus diesen von Ihnen angegebenen Gleichungen möchte ich das aktuelle X & Y für eine bestimmte Zeit (t) erhalten. Soll ich mein Vo durch V_x und Vo durch v_y ersetzen? Auch wenn ich die anfängliche KE hinzufügen muss, mit der der Ball abgefeuert wurde, ist dies KE=0.5*m*(V*V)gültig?
Smith

@ Smith Ich werde meine Antwort bearbeiten, um Ihre Fragen zu berücksichtigen
Jonas Bötel

das ist genau das, was ich getan habe und x ist immer negativ, warum?
Smith
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.