10
\$\begingroup\$

I'm developing a 2D golf game in VB.NET 2005, but I am stuck on how to implement air or wind drag that should affect the ball.

Already I have these equations for projectile:

  • \$v_0\$ for the initial velocity of a golfball when hit or fired
  • Vertical and horizontal components the velocity of the golfball: $$ \begin{align} v_x &= v_0 cos(\theta) \\ v_y &= v_0 sin(\theta) - gt* \end{align} $$

  • Vertical and horizontal distance of golfball: $$ \begin{align} x &= v_0cos(\theta)t \\ y &= v_0sin(\theta) t - (0.5)gt^2 \end{align} $$

How do I add air drag to this equation to properly affect the velocity of the golf ball? I don't have any idea how to do it, has anyone worked with similar equations?

\$\endgroup\$
10
\$\begingroup\$

I'm not sure if there even exists a closed form for drag or wind, but it is quite easy to simulate in a step-wise fashion (like all the physics libraries do):

  1. set your initial condition:

    $$ x, y, v_x, v_y \; (\text{for }t=0) $$

  2. update position:

    $$ x = x + (v_x \times dt) \\ y = x + (v_y \times dt) $$

    (where dt is the time elapsed since the last update, aka delta time)

  3. calculate these velocity helpers:

    $$ \begin{align} v^2 &= (v_x)^2 + (v_y)^2 \\ \lvert v \rvert &= \sqrt{v^2} \end{align} $$

    (where \$\lvert v \rvert\$ represents the length of \$v\$)

  4. calculate drag force:

    $$ f_{drag} = c \times v^2 $$

    (where c is the coefficient of friction small!)

  5. accumulate forces:

    $$ \begin{align} f_x &= \left(-f_{drag} \times {v_x \over \lvert v \rvert}\right) \\ f_y &= \left(-f_{drag} \times {v_y \over \lvert v \rvert}\right) + (-g \times mass) \end{align} $$

    (where \$mass\$ is the mass of your golf ball)

  6. update velocity:

    $$ v_x = v_x + f_x \times \frac{dt}{mass} \\ v_y = v_y + f_y \times \frac{dt}{mass} $$

That's basically Euler's Method for approximating those physics.


A bit more on how the simulation as requested in the comments:

  • The initial condition \$(t = 0)\$ in your case is

$$ \begin{align} x &= 0 \\ y &= 0 \\ v_x &= v_0 \times cos(\theta) \\ v_y &= v_0 \times sin(\theta) \end{align} $$

It's basically the same as in your basic trajectory formula where every occurrence of t is replaced by 0.

  • The kinetic energy \$KE = 0.5m(V^2) \$ is valid for every \$t\$. See \$v^2\$ as in (3) above.

  • The potential energy \$ PE = m \times g \times y \$ is also always valid.

  • If you want to get the current \$(x,y)\$ for a given \$t_1\$, what you need to do is initialize the simulation for \$t = 0\$ and do small dt updates until \$t = t_1\$

  • If you already calculated \$(x,y)\$ for a \$t_1\$ and you want to know their values for a \$t_2\$ where \$t_1 \lt t_2\$, all you need to do is calculating those small dt update steps from \$t_1\$ to \$t_2\$

Pseudo-Code:

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
\$\endgroup\$
  • \$\begingroup\$ Thank you so much for this, i'll try it out an get back to you. \$\endgroup\$ – Smith Apr 15 '11 at 7:47
  • \$\begingroup\$ from these equations you provided, i'd like to get the current X & Y for a give time (t), should i replace my Vo with V_x and Vo with v_y? Also if i need to add the initial KE with which the ball was fired, will this KE=0.5*m*(V*V) be valid? \$\endgroup\$ – Smith Apr 15 '11 at 8:28
  • \$\begingroup\$ @Smith I'll edit my answer to account for your questions \$\endgroup\$ – Jonas Bötel Apr 15 '11 at 10:00
  • \$\begingroup\$ this is exactly what i did, and x is always negative, why? \$\endgroup\$ – Smith Apr 15 '11 at 11:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.