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!


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.

  • \$\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\$ – user1062704 Sep 27 '13 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\$ – Drew Cummins Sep 27 '13 at 14:42

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.