Додавання вологості повітря до рівняння траєкторії м'яча для гольфу


10

Я розробляю 2D гру в гольф у VB.NET 2005, але я застряг у тому, як реалізувати повітря або затягування вітру, які повинні впливати на м'яч.

Вже зараз у мене є такі рівняння для снаряду:

  • v0 для початкової швидкості руху м'яча для гольфу при ударі або стрільбі
  • Вертикальні та горизонтальні компоненти швидкості руху в гольф:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Вертикальна та горизонтальна відстань у гольфбол:

    x=v0cos(θ)тy=v0сiн(θ)т-(0,5)гт2

Як додати тягання повітря до цього рівняння, щоб правильно впливати на швидкість кульки для гольфу? Я не маю уявлення, як це зробити, хтось працював із подібними рівняннями?

Відповіді:


10

Я не впевнений, чи існує навіть закрита форма для перетягування або вітру, але це досить легко моделювати поетапно (як це роблять усі бібліотеки фізики):

  1. встановіть початкову умову:

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

    x=x+(vx×dt)y=х+(vу×гт)

    (де dt - час, що минув з моменту останнього оновлення, aka delta time)

  3. обчисліть ці помічники швидкості:

    v2=(vх)2+(vу)2|v|=v2

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

  4. розрахувати силу перетягування:

    fгrаг=c×v2

    (де c - коефіцієнт тертя малий! )

  5. накопичують сили:

    fх=(-fгrаг×vх|v|)fу=(-fгrаг×vу|v|)+(-г×масс)

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

  6. швидкість оновлення:

    vх=vх+fх×гтмассvу=vу+fу×гтмасс

Це в основному метод Ейлера для наближення цієї фізики.


Трохи більше про те, як моделювання, як вимагається в коментарях:

  • Початкова умова у вашому випадку така(т=0)

х=0у=0vх=v0×cос(θ)vу=v0×сiн(θ)

Це в основному те саме, що і у вашій базовій формулі траєкторії, де кожне виникнення t замінюється на 0.

  • Кінетична енергія справедлива для кожного . Дивіться як у (3) вище.КЕ=0,5м(V2)тv2

  • Потенційна енергія також завжди діє.ПЕ=м×г×у

  • Якщо ви хочете отримати поточний для заданого , вам потрібно ініціалізувати моделювання для і робити невеликі оновлення dt до(х,у)т1т=0т=т1

  • Якщо ви вже обчислили для і хочете знати їх значення для де , все, що вам потрібно зробити, - це обчислити ті невеликі кроки оновлення dt від до(х,у)т1т2т1<т2т1т2

Псевдокод:

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)дійсно?
Сміт

@Smith Я відредагую свою відповідь на рахунок Ваших запитань
Йонас Бётель

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