Gravity's acceleration between two objects

2019-02-20 23:46发布

问题:

So I am making a program, where you can have two objects (circles). I want them to orbit like planets around each other, but only in 2D.

I know that using Newtons Universal Law of Gravitation I can get the force between the two objects. I also know A = F / M. My question is how would I take the A from the previous equation and change it into a vector?

回答1:

You need to use vector equations:

// init values (per object)
double ax=0.0,ay=0.0,az=0.0; // acceleration [m/s^2]
double vx=0.0,vy=0.0,vz=0.0; // velocity [m/s]
double  x=0.0, y=0.0, z=0.0; // position [m]
double m=1.0;                  // mass [kg] 

// iteration inside some timer (dt [seconds] period) ...   
int i; double a,dx,dy,dz; // first compute acceleration
for (ax=0.0,ay=0.0,az=0.0,i=0;i<obj.num;i++) 
 if (obj[i]!=this) // ignore gravity from itself
  {
  dx=obj[i].x-x;
  dy=obj[i].y-y;
  dz=obj[i].z-z;
  a=sqrt((dx*dx)+(dy*dy)+(dz*dz));     // a=distance to obj[i]
  a=6.67384e-11*(obj[i].m*m)/(a*a*a); // a=acceleration/distance to make dx,dy,dz unit vector 
  ax+=a*dx; // ax,ay,az = actual acceleration vector (integration)
  ay+=a*dy;
  az+=a*dz;
  }
vx+=ax*dt; // update speed via integration of acceleration
vy+=ay*dt;
vz+=az*dt;
 x+=vx*dt; // update position via integration of velocity
 y+=vy*dt;
 z+=vz*dt;

Code is taken from here

  • obj[] is list of all your objects
  • obj.num is the count of them

I recommend to create object class with all the variables inside (ax,ay,az,...m), init them once and then continuously update (iteration) in some timer. If you want more accuracy then you should compute ax,ay,az for all objects first and only after update speed and position (to avoid change of position of objects during gravity computation). If you want to drive an object (like with truster) then just add its acceleration to ax,ay,az vector)

Now to setup an orbit just:

  1. place planet object

    must be massive enough and also set its position / velocity to what you want

  2. place satellite

    Initial position should be somewhere near planet. It should not be too massive. Init also speed vector with tangent direction to orbiting trajectory. If speed is too low it will collapse into planet and if speed is too high it will escape from planet otherwise will be orbiting (circle or ellipse)

  3. timer

    lower the interval better the simulation usually 10ms is OK but for massive and far objects is also 100ms and more OK. If you want particles or something then use 1ms (very dynamic sceene).

I strongly recommend to read this related QA:

  • Is it possible to make realistic n-body solar system simulation in matter of size and mass?

especially [edit3] about the integration precision and creating orbital data.



回答2:

With two objects you are probably best using an ellipse which is the path the objects will follow about their common center of mass. Read Kepler's laws of planetary motion which gives the background.

If one object is a much greater mass than the other, i.e. a sun and a planet you can have one stationary and the other taking an elliptical path. The equation of the ellipse is given by

r = K e / ( 1 + e cos(theta))

K is a constant giving the size and e is the eccentricity. If you want an elliptical orbit have 0 < e < 1 the smaller it is the more circular the orbit. To get x, y coordinates from this use, x = r cos(theta), y = r sin(theta). The missing bit is time and how the angle is dependant on time. This is where the second and third laws come in. If a and b are the semi-major and semi-minor lengths of the ellipse, and P is the period then

0.5 * P * r^2 theta'= pi a b

theta' is the rate of change of angle with respect to time (d theta/d t). You can use this to get how much theta will change given a increase in time. First work out the current radius r0 given the current angle th0 if the time increment is δt then the angle increment δtheta is

δtheta = 2 pi * a * b / r^2 * δt

and the next angle is th0 + δtheta.

If the masses are of similar magnitude then see two body problem. Both objects will have elliptical orbits, there are two patterns which you can see in animations on that page. The ellipses will follow the same formula as above with the focus at the common center of mass.

If you have three object things get considerably harder and there are not generally neat solutions. See three body problem for this.