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?

Schmied
quelle

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
Jonas Bötel
quelle
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