重力在两个物体之间的加速度

时间:2014-07-14 19:00:31

标签: math game-physics

所以我正在制作一个程序,你可以在这里有两个对象(圆圈)。我希望它们像行星一样围绕彼此进行轨道运行,但仅限于2D。

我知道使用牛顿万有引力定律我可以在两个物体之间获得力。我也知道A = F / M.我的问题是如何从前面的等式中取出A并将其改为向量?

2 个答案:

答案 0 :(得分:2)

您需要使用矢量方程式:

// 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;

代码取自here

  • obj[]是所有对象的列表
  • obj.num是他们的计数

我建议创建包含(ax,ay,az,...m)内所有变量的对象类,初始化它们,然后在某个计时器中不断更新(迭代)。如果您想要更高的精确度,那么您应该首先计算所有对象的ax,ay,az,并且仅在更新速度和位置之后(以避免在重力计算期间改变对象的位置)。如果你想驾驶一个物体(比如使用truster),那么只需将其加速度添加到ax,ay,az矢量)

现在只需设置一个轨道:

  1. 放置行星物体

    必须足够大,并将其position / velocity设置为您想要的

  2. 放置卫星

    初始位置应该在行星附近。它不应该太大。 Init还以轨道轨迹的切线方向加速矢量。如果速度太低,它将坍塌到行星,如果速度太高,它将从行星逃逸,否则将绕轨道运行(圆形或椭圆形)

  3. <强>计时器

    更好地缩短间隔,通常10ms模拟是正常的,但对于大型和远距离物体也是100ms并且更好。如果您想要粒子或其他东西,请使用1ms(非常动态的场景)。

  4. 我强烈建议您阅读此相关质量检查

    尤其[edit3]关于积分精度和创建轨道数据。

答案 1 :(得分:0)

对于两个物体,您可能最好使用椭圆,椭圆是物体沿着它们的共同质心所遵循的路径。阅读提供背景的Kepler's laws of planetary motion

如果一个物体的质量远大于另一个物体,即太阳和行星,则可以使一个物体静止,另一个物体采用椭圆形路径。椭圆的方程由

给出

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

K是一个给出大小的常量,e是怪癖。如果你想椭圆轨道有0&lt; e&lt; 1越小,轨道就越圆。要从此用途获得x,y坐标,x = r cos(theta),y = r sin(theta)。丢失的位是时间以及角度如何依赖于时间。这是第二和第三定律进入的地方。如果ab是椭圆的半长和半长,而P是周期,那么

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

theta'是角度相对于时间的变化率(dθ/ dt)。您可以使用它来获得随着时间的增加θ会发生多大变化。如果时间增量为δt则首先计算出当前半径r 0 给定当前角度th 0 然后角度增量δtheta

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

,下一个角度为 0 +δthethe。

如果质量大小相同,请参阅two body problem。两个对象都有椭圆轨道,有两种模式可以在该页面的动画中看到。椭圆将遵循与上述相同的公式,焦点位于共同的质心。

如果你有三个对象的事情变得相当困难,并且通常没有整洁的解决方案。请参阅three body problem