Dodanie oporu powietrza do równania trajektorii piłki golfowej

10

Zajmuję się tworzeniem gry w golfa 2D w VB.NET 2005, ale utknąłem przy wdrażaniu oporu powietrza lub wiatru, który powinien wpływać na piłkę.

Mam już te równania dla pocisku:

  • v0 dla początkowej prędkości piłki golfowej po trafieniu lub wystrzeleniu
  • Składniki pionowe i poziome prędkość :

    vx=v0doos(θ)vy=v0sjan(θ)-solt
  • Odległość do pionie i poziomie:

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

Jak dodać opór powietrza do tego równania, aby odpowiednio wpłynąć na prędkość piłki golfowej? Nie mam pojęcia, jak to zrobić, czy ktoś pracował z podobnymi równaniami?

Kowal
źródło

Odpowiedzi:

10

Nie jestem pewien, czy istnieje nawet zamknięta forma dla przeciągania lub wiatru, ale dość łatwo można symulować krok po kroku (jak to robią wszystkie biblioteki fizyki):

  1. ustaw swój stan początkowy:

    x,y,vx,vy(for t=0)
  2. zaktualizuj pozycję:

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

    (gdzie dt to czas, jaki upłynął od ostatniej aktualizacji, czyli czas delta)

  3. obliczyć te pomocniki prędkości:

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

    (gdzie reprezentuje długość )v|v|v

  4. obliczyć siłę oporu:

    fdrag=c×v2)

    (gdzie c jest małym współczynnikiem tarcia ! )

  5. kumulować siły:

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

    (gdzie jest masą twojej piłki golfowej)mass

  6. prędkość aktualizacji:

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

To w zasadzie Metoda Eulera do przybliżenia tej fizyki.


Nieco więcej o tym, jak symulacja jest wymagana w komentarzach:

  • Warunek początkowy w twoim przypadku to(t=0)

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

Jest to w zasadzie to samo co w podstawowej formule trajektorii, w której każde wystąpienie t jest zastępowane przez 0.

  • Energia kinetyczna obowiązuje dla każdego . Zobacz jak w (3) powyżej.KE=0.5m(V2)tv2

  • Energia potencjalna jest również zawsze ważna.PE=m×g×y

  • Jeśli chcesz uzyskać bieżący dla danego , musisz zainicjować symulację dla i wykonywać małe aktualizacje dt, aż(x,y)t1t=0t=t1

  • Jeśli już obliczyłeś dla i chcesz poznać ich wartości dla gdzie , wszystko, co musisz zrobić, to obliczyć te małe kroki aktualizacji dt od do(x,y)t1t2t1<t2t1t2

Pseudo kod:

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
źródło
Dziękuję bardzo za to, wypróbuję to i wrócę do ciebie.
Smith
z tych równań, które podałeś, chciałbym uzyskać bieżące X i Y na czas (t), czy powinienem zamienić moje Vo na V_x i Vo na v_y? Czy również w przypadku potrzeby dodania początkowego KE, za pomocą którego piłka została wystrzelona, ​​będzie to KE=0.5*m*(V*V)ważne?
Smith
@Smith Zedytuję odpowiedź na twoje pytania
Jonas Bötel
dokładnie to zrobiłem, a x jest zawsze ujemne, dlaczego?
Smith