2
\$\begingroup\$

I'm just starting with game development and some physics related to that. Basically I want to calculate a trajectory given an initial velocity and as well as an elevation / angle. So I wrote this code in Java (I left out some class related code and such):

int v0 = 30; // m/s
int angle = 60;
double dt = 0.5; // s

double vx = v0 * Math.cos(Math.PI / 180 * angle);
double vy = v0 * Math.sin(Math.PI / 180 * angle); 

double posx = 1; // m
double posy = 1;  // m
double time = 0; // s

while(posy > 0)
{
   posx +=  vx * dt;
   posy += vy * dt;
   time += dt;

   // change speed in y  
   vy -= 9.82 * dt; // gravity
}

This seems to work fine. However, is there a better way to do this? Also, is it possible to scale so that 5 meter (in calculation) corresponds to 1 m for the posx and posy variables?

Thanks in advance!

\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

The equations of motion for a projectile are:

x(t) = x0 + v0 * t + 0.5g * t^2

where x0 and v0 are your initial position and velocity respectively ([posx, posy] and [vx, vy] in your code), g is the gravitational acceleration (9.82m/s^2 in your code) and t is the time, in seconds.

So, instead of looping, you can find your projectile's position at any time t.

When you map from physical space to pixel space, you need a single value that scales meters to pixels. You want 5 meters to be 1 pixel, so simply divide your physical quantities related to position by 5.

\$\endgroup\$
2
  • \$\begingroup\$ I have not tested the equation you provided, although in this case I will have to do this by looping. With an initial velocity of 30 m/s and an elevation of 60 degrees (later converted to radians) I will get the result about 80~ meters (posx). Now what I mean by scaling is that I need to be able to draw this on the screen (hence the looping) and I don't want 1 pixel to represent 1 m in the calculation (imagine how much space) but every 5 m in the calculation should correspond to 1 pixel, e.g. 1 m - on the screen -.. is this better explained? \$\endgroup\$ Sep 27, 2013 at 14:26
  • \$\begingroup\$ You can (and should) still use the equation I provided, even if you're rendering and hence need to loop; what you've implemented is a numerical approximation of what I've given you and is not physically correct, though it's fine in most circumstances. I'll edit my answer to include scaling. \$\endgroup\$ Sep 27, 2013 at 14:42

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .