Started by Aug 11 2001 04:52 AM

,
4 replies to this topic

Posted 11 August 2001 - 04:52 AM

Hi!
Im working on a small worms clone and what i need is a formula that calculates the way of a bullet in air... need to draw its path through air...
My different variables are:
Power: 0 - 100
Angle: 0 - 180
Does any of you have any examples or references?
Thanks.
-Robert-

Posted 11 August 2001 - 07:08 AM

Well, this is a pretty simple generalization of projectile motion, but here goes:

Basically, we''re talking 2-Dimensional motion. One motion in the y direction, and another in the x. Assuming there is no wind or air resistence, the x velocity shall remain constant throughout. However, because of gravity, the y velocity will constantly increase in the negative y direction.

Basically, you give your yv (y velocity) some initial positive value, and set g (gravitational acceleration) to whatever arbitrary value you want. To calculate the new yv, you would simply do this:

yv = yv + g;

To update the positions:

y = y + yv;

x = x + xv;

I hope this helped a little.

Free Speech, Free Sklyarov

Fight the unconstitutional DMCA.

Commander M

Basically, we''re talking 2-Dimensional motion. One motion in the y direction, and another in the x. Assuming there is no wind or air resistence, the x velocity shall remain constant throughout. However, because of gravity, the y velocity will constantly increase in the negative y direction.

Basically, you give your yv (y velocity) some initial positive value, and set g (gravitational acceleration) to whatever arbitrary value you want. To calculate the new yv, you would simply do this:

yv = yv + g;

To update the positions:

y = y + yv;

x = x + xv;

I hope this helped a little.

Free Speech, Free Sklyarov

Fight the unconstitutional DMCA.

Commander M

Posted 11 August 2001 - 07:42 AM

Okay, let''s asume that your "power" unit creates a velocity of 1 unit per second.

If you are working in a 2-D plane, your 2 initial velocity components are going to be like this:

ViX = Power * cos(Angle)

ViY = Power * sin(Angle)

Then, you just use the simple projectile motion formulas from calc:

X = X + (ViX * time)

Y = Y + (ViY * time) + (.5 * Gravity) * (time * time)

If you are working in a 2-D plane, your 2 initial velocity components are going to be like this:

ViX = Power * cos(Angle)

ViY = Power * sin(Angle)

Then, you just use the simple projectile motion formulas from calc:

X = X + (ViX * time)

Y = Y + (ViY * time) + (.5 * Gravity) * (time * time)

Posted 12 August 2001 - 01:54 AM

Ok!

I can get it to fire a ''*'' through the air but the projectile just starts moving downwards as soon it leaves its start position. Well it should be moving upwards a while and then start to move down... or....

*What should i have as my gravity? Tried with .6.

*Should i use ordinary angles or radians, if radians how do i calculate it?

*What about time? Should i increase it with, say +.6 every frame or more?

-Robert-

I can get it to fire a ''*'' through the air but the projectile just starts moving downwards as soon it leaves its start position. Well it should be moving upwards a while and then start to move down... or....

*What should i have as my gravity? Tried with .6.

*Should i use ordinary angles or radians, if radians how do i calculate it?

*What about time? Should i increase it with, say +.6 every frame or more?

-Robert-

Posted 12 August 2001 - 05:10 AM

The c++ trig functions expect radians, not degrees. To convert angle theta into radians:

radians = theta * PI / 180;

I would make that into a macro since you''ll probably find it more intuitive to work with angles than radians. And precalculate PI / 180 for an easy optimization.

Remember that on a computer Y coordinates generally increase towards the bottom of the screen. That may be causing your projectile problem. And btw on earth g == -9.8

If you''re going to add a specific amount to the time every frame it should be a lot smaller than 0.6 seconds, or your projectiles are going to move like lightning. Some other ways to update the time are to actually calculate the time elapsed between frames and use that amount, or have your program time itself and only update the physics after a specific period of time, maybe every 0.1 seconds

radians = theta * PI / 180;

I would make that into a macro since you''ll probably find it more intuitive to work with angles than radians. And precalculate PI / 180 for an easy optimization.

Remember that on a computer Y coordinates generally increase towards the bottom of the screen. That may be causing your projectile problem. And btw on earth g == -9.8

If you''re going to add a specific amount to the time every frame it should be a lot smaller than 0.6 seconds, or your projectiles are going to move like lightning. Some other ways to update the time are to actually calculate the time elapsed between frames and use that amount, or have your program time itself and only update the physics after a specific period of time, maybe every 0.1 seconds