Добавление воздушного сопротивления в уравнение траектории мяча для гольфа


10

Я занимаюсь разработкой 2D-игры в гольф в VB.NET 2005, но я застрял в том, как реализовать сопротивление воздуха или ветра, которое должно влиять на мяч.

Уже у меня есть эти уравнения для снаряда:

  • v0 для начальной скорости мяча для гольфа при ударе или увольнении
  • Вертикальные и горизонтальные составляющие скорости мяча для гольфа:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Вертикальное и горизонтальное расстояние мяча для гольфа:

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

Как добавить воздушное сопротивление в это уравнение, чтобы правильно влиять на скорость мяча для гольфа? Я понятия не имею, как это сделать, кто-нибудь работал с подобными уравнениями?

Ответы:


10

Я не уверен, существует ли вообще замкнутая форма для перетаскивания или ветра, но довольно просто смоделировать поэтапно (как это делают все физические библиотеки):

  1. установить ваше начальное условие:

    x,y,vx,vy(for t=0)
  2. обновить позицию:

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

    (где dt - время, прошедшее с момента последнего обновления, то есть время дельты)

  3. рассчитать эти помощники скорости:

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

    (где представляет длину )v|v|v

  4. рассчитать силу сопротивления:

    fdrag=c×v2

    (где с - коэффициент трения малый! )

  5. накапливать силы:

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

    (где - масса вашего мяча для гольфа)mass

  6. скорость обновления:

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

Это в основном метод Эйлера для аппроксимации этой физики.


Немного подробнее о том, как симуляция, как просили в комментариях:

  • Начальное условие в вашем случае(t=0)

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

Это в основном так же, как в вашей базовой формуле траектории, где каждое вхождение t заменяется на 0.

  • Кинетическая энергия справедлива для каждого . Смотрите как в (3) выше.KE=0.5m(V2)tv2

  • Потенциальная энергия также всегда верна.PE=m×g×y

  • Если вы хотите получить текущий для данного , вам нужно инициализировать симуляцию для и делать небольшие обновления dt, покаt 1 t = 0 t = t 1(x,y)t1t=0t=t1

  • Если вы уже вычислили для и хотите узнать их значения для где , все, что вам нужно сделать, - это рассчитать эти маленькие шаги обновления dt с доt 1 t 2 t 1 < t 2 t 1 t 2(x,y)t1t2t1<t2t1t2

Псевдо-код:

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

Большое вам спасибо за это, я постараюсь вернуться к вам.
Смит

Из этих уравнений, которые вы предоставили, я хотел бы получить текущие значения X & Y для заданного времени (t), должен ли я заменить свое Vo на V_x, а Vo на v_y? Также, если мне нужно будет добавить исходное КЕ, с которого был запущен мяч, это KE=0.5*m*(V*V)будет действительно?
Смит

@ Смит Я отредактирую свой ответ, чтобы учесть твои вопросы
Йонас Бетел

это именно то, что я сделал, и х всегда отрицательный, почему?
Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.