Closed. This question needs to be more focused。它当前不接受答案。












想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。

1年前关闭。



Improve this question




在过去的几周中,我一直在尝试模拟大学系统中正在制作的太阳系模拟中的轨道。简而言之,我的仿真是使用Ogre3D渲染引擎以C++编写的。我尝试使用牛顿万有引力定律来实现轨道,该定律使我的行星笔直地朝向太阳,穿过太阳,然后回到其初始位置。我还尝试了Wikit_a Wikit_a的“位置作为时间的函数”部分中的步骤,但是这对我也不起作用。

我使用一种简单的Euler积分方法来驱动仿真。如果有人对这种模拟有任何经验,或者只对这些物理定律有很多了解,那么对我的帮助或对正确方向的指导将不胜感激。

最佳答案

您必须使行星初始速度v =(vx,vy,vz)与所需轨道相切。如果太阳的位置是s,行星的位置是p,则在两者之间始终存在作用力:行星上的力指向太阳, vector t =(s-p),反之亦然。该力的大小为g Ms Mp/(t点t),其中“点”是点积,g是由于重力引起的标准加速度,而Ms,Mp是各自的质量。

如果您正在做一个详细的模型,其中所有物体都可以对所有其他物体施加拉力,那么该算法将累积所有成对力,以获得作用在每个物体(行星或太阳)上的单个合力 vector 。否则,您可能会选择一个近似值,即只有太阳在行星上拉动,而其他力却被认为太小而无足轻重。

所以算法是:

Choose dt, the time step, a small interval.
Set initial positions and velocities
    (for planets, velocity is tangent to desired orbit. Sun has velocity zero.)
loop
  Accumulate all forces on all bodies with current positions.
  For each body position=p, velocity=v, net resultant force=f, mass=m,
    update its velocity: v_new = v + f / m dt
    update position p_new = p + 0.5 * (v + v_new)
    v = v_new; p = p_new
  Render
end loop

如前所述,欧拉很简单,但是需要非常小的时间步才能达到合理的精度。有时,您可以在系统中引入一点点阻力(将速度乘以一个略低于1的系数),以使事情稳定下来,否则它们会爆炸。

关于c++ - 使用物理定律模拟轨道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22104128/

10-11 16:03