所以我正在制作一个程序,你可以在这里有两个对象(圆圈)。我希望它们像行星一样围绕彼此进行轨道运行,但仅限于2D。
我知道使用牛顿万有引力定律我可以在两个物体之间获得力。我也知道A = F / M.我的问题是如何从前面的等式中取出A并将其改为向量?
答案 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
矢量)
现在只需设置一个轨道:
放置行星物体
必须足够大,并将其position / velocity
设置为您想要的
放置卫星
初始位置应该在行星附近。它不应该太大。 Init还以轨道轨迹的切线方向加速矢量。如果速度太低,它将坍塌到行星,如果速度太高,它将从行星逃逸,否则将绕轨道运行(圆形或椭圆形)
<强>计时器强>
更好地缩短间隔,通常10ms
模拟是正常的,但对于大型和远距离物体也是100ms
并且更好。如果您想要粒子或其他东西,请使用1ms
(非常动态的场景)。
我强烈建议您阅读此相关质量检查:
尤其[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)。丢失的位是时间以及角度如何依赖于时间。这是第二和第三定律进入的地方。如果a
和b
是椭圆的半长和半长,而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。