Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Basic Projectile with Wind

  1. Feb 6, 2012 #1
    Hey I am making a game with basic a projectile that includes gravity and wind and I don't know how I can control the wind direction and power. Here is what I've got without wind:

    x = 0 /// x starting position
    y = 0 /// y starting position
    r = 10 /// radius of projectile
    time = 0
    g = 9.8 /// Gravity
    theta = 45 /// 45 degrees starting angle
    v0x = v * cos(theta * Math.PI/180) /// Angle in radians(?) multiplied by velocity
    v0y = v * sin(theta * Math.PI/180) /// Angle in radians(?) multiplied by velocity

    My method for calculating the X and Y position of the bullet is to increase the frameCount by 0.10 each frame:

    y = y - v0y * time - (1/2 * g * (time^2)) /// "^2" denotes squared
    x = x + v0x * time ///
    time = time + 0.10 // increase time for the next frame

    So the way I interpret this is that every frame I apply gravity to the Y coord and no forces to the X coord (the force applied to the Y coord is: minus 1/2 * gravity * time squared)

    Now I figured out if I apply more gravity and a force to the X coord it will act like wind is effecting the projectile however I don't know the proportion of extra force I should I apply to the X and to the Y to make it appear like there is a lot of wind effecting the projectile in say -45 degree angle.

    Can anybody help?
  2. jcsd
  3. Feb 7, 2012 #2
    Something like this I think but I could be wayy off base... I'm pretty sleepy.

    Code (Text):

    struct Projectile
        float x;
        float y;

        float velocityX;
        float veloctiyY;

        float mass;

    struct Wind
        float velocityX;
        float velocityY;

    Projectile  projectile;
    Wind        wind;

    void RunFrame( float timestep )
        // add gravity
        projectile.velocityY += -9.80665f * timestep;

        // add wind
        projectile.velocityX += (wind.velocityX - projectile.velocityX) / projectile.mass * timestep;
        projectile.velocityY += (wind.velocityY - projectile.velocityY) / projectile.mass * timestep;

        // integrate velocity
        projectile.x += 0.5f * projectile.velocityX * timestep * timestep;
        projectile.y += 0.5f * projectile.velocityY * timestep * timestep;

        // draw
  4. Feb 7, 2012 #3
    Since it's just a game, you can use a simple model for drag in which the drag force is proportional to the wind speed (it's actually proportional to the square of the wind speed, but that makes everything really complicated):
    [itex]\vec F_w = \alpha (\vec v_w - \vec v) [/itex]
    [itex]\alpha[/itex] is a constant that depends on the shape and size of the object. A very aerodynamic object has a low [itex]\alpha[/itex]. That gives you
    [itex]\vec v' = \vec h - k \vec v[/itex] (1)
    where [itex]\vec h = -g \hat j + k \vec v_w[/itex] and [itex]k = \frac{\alpha}{m}[/itex]. [itex]\vec h[/itex] is the new effective gravitational field. (1) is a differential equation with the unknown function being [itex]\vec v[/itex]. There is a constant solution. This is the terminal velocity. Call it [itex]\vec c[/itex].
    [itex]\vec c = \frac{\vec h}{k}[/itex]
    All solutions gradually approach this velocity. The full solution is
    [itex]\vec v(t) = (\vec v(0) - \vec c) e^{-kt} + \vec c[/itex].
    Integrating this gives you
    [itex]\vec r(t) = -\frac{1}{k} (1 - e^{-kt}) (\vec v(0) - \vec c) + \vec c t + \vec r(0)[/itex]

    That should get you started.
    Last edited: Feb 7, 2012
  5. Feb 7, 2012 #4
    James Leighe that really helped me out! However I think there are a few mistakes in your math for example:

    Code (Text):
    projectile.x += 0.5f * projectile.velocityX * timestep * timestep;
    projectile.y += 0.5f * projectile.velocityY * timestep * timestep;
    should be

    Code (Text):
    projectile.x += 0.5f * projectile.velocityX * timestep * timestep;
    projectile.y [COLOR="Red"][B]-[/B][/COLOR]= 0.5f * projectile.velocityY * timestep * timestep;
    Also the gravity should be subtracting not adding:

    Code (Text):
    projectile.velocityY [COLOR="red"][B]-[/B][/COLOR]= -9.80665f * timestep;

    apart from then I just tweaked the numbers around until it looks good :) Thanks for your help!
  6. Feb 7, 2012 #5
    Also to edit your code I took out the time squared, it was giving it weird results:

    Code (Text):
    projectile.x += 0.5f * projectile.velocityX * timestep;
  7. Feb 7, 2012 #6
    Feel free to test out my code:
    this includes draw, and collision

    Obviously some user interface glitches that I'm not concerned right now.
    the wind indicator in top middle shows the direction and power of the wind (from 0 being low to 23 being highest)
    the user is stuck at power 20 for the initial velocity of the projectile just for testing purposes

    sorry if you have a small screen and it all doesn't fit, when I work on the camera control (pan and zoom) it will fit to your screen.

    Also when you refresh it will change the wind direction and speed


    Currently it's hosted here but I will probably overwrite it soonL
    "jastanton.com/experiments/worms" [Broken]
    Last edited by a moderator: May 5, 2017
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook