【问题标题】:Gravity's acceleration between two objects两个物体之间的重力加速度
【发布时间】:2014-07-14 19:00:31
【问题描述】:

所以我正在制作一个程序,您可以在其中有两个对象(圆圈)。我希望它们像行星一样围绕彼此运行,但仅限于二维。

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

【问题讨论】:

  • A 是一个标量(加速度的大小)。将标量与方向相关联会给您一个向量。问题不清楚。
  • 我能找到方向吗?或者更好的是,我还需要查看哪些方程式才能让两个球绕轨道运行?
  • 方向是朝向另一个对象。
  • 如果 F 是一个向量,那么 A 也是一个向量。 en.wikipedia.org/wiki/…

标签: math game-physics


【解决方案1】:

你需要使用向量方程:

// 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. 放置卫星

    初始位置应该在行星附近的某个地方。它不应该太大。初始化还具有与轨道轨迹相切方向的速度矢量。如果速度太低,它会坍缩成行星,如果速度太高,它会逃离行星,否则会绕轨道运行(圆形或椭圆形)

  3. 计时器

    模拟的间隔越小越好,通常10ms 是可以的,但对于大而远的物体也是100ms 和更多的。如果您想要粒子或其他东西,请使用1ms(非常动态的场景)。

我强烈推荐阅读这篇相关的QA

特别是[edit3]关于积分精度和创建轨道数据。

【讨论】:

    【解决方案2】:

    对于两个对象,您可能最好使用椭圆,这是对象围绕其共同质心所遵循的路径。阅读提供背景的Kepler's laws of planetary motion

    如果一个物体的质量比另一个大得多,即太阳和行星,您可以让一个物体静止,另一个走椭圆形路径。椭圆方程由下式给出

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

    K 是给出尺寸的常数,e 是偏心率。如果你想要一个椭圆轨道,0 a 和b 是椭圆的半长和半短长度,P 是周期,那么

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

    theta' 是角度相对于时间的变化率 (d theta/d t)。您可以使用它来获取随着时间的增加,theta 会发生多少变化。首先计算当前半径 r0 给定当前角度 th0 如果时间增量是 δt 那么角度增量 δtheta 是

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

    下一个角度是th0 + δtheta。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多