C# Unity 3D中轨道物体和行星之间的距离大小变化

C# Unity 3D中轨道物体和行星之间的距离大小变化,c#,unity3d,2d,game-physics,orbital-mechanics,C#,Unity3d,2d,Game Physics,Orbital Mechanics,我很难理解这个问题,因为我无法理解: 我正试图使用维基百科上的公式,让一个物体在环绕行星的圆形轨道上移动,以下是我的代码: public void circularOrbit(Collider2D col,float planetMass){ mPlanet = planetMass; dist = new Vector2 (col.gameObject.transform.position.x - gameObject.transform.position.x, col.ga

我很难理解这个问题,因为我无法理解:

我正试图使用维基百科上的公式,让一个物体在环绕行星的圆形轨道上移动,以下是我的代码:

public void circularOrbit(Collider2D col,float planetMass){

    mPlanet = planetMass;
    dist = new Vector2 (col.gameObject.transform.position.x - gameObject.transform.position.x, col.gameObject.transform.position.y - gameObject.transform.position.y);
    r = dist.magnitude;
    print (r);
    tdist = new Vector2 (-dist.y, dist.x).normalized; // 2D vector prependicular to the dist vector .
    float speed =  Mathf.Sqrt ( G*mPlanet / r)  ; // Calculate the velocity .
    print (speed);
    rigidbody2D.velocity = tdist * speed; 


}
2D对撞机
col
是行星轨道的对撞机,根据我的计算,当我的物体撞上这个对撞机时,它开始以圆形方式移动

所有的东西都在一个固定的更新中,有一些条件(与本主题无关),我面临的问题是我的距离大小在每一帧都在变化,我需要它保持不变

这会导致问题,因为速度会改变,对于其他脚本,我需要修复它

以下是距离幅值的一些值:

4.602833

4.602901

4.603098

变化很小,但对我的游戏性影响太大了


那么请解释为什么会这样


谢谢。

物理引擎对固定更新执行更新。在这些更新之间,重力不会作用于对象。因此,它在直线段中移动,该直线段开始与所需圆相切,但在固定更新周期结束时,距离略有增加,因为直线段与圆不同。结果是,您可能会看到比舍入错误大得多的错误

这个误差是线性的。如果更新次数是原来的两倍,或者将速度和重力降低了两倍,则每一步的误差将减少大约四倍,但由于每个轨道的更新次数是原来的两倍,因此每个轨道的额外距离将减少两倍

如果你有一个复杂的模拟,物体在椭圆中移动,并且有多个重要的重力源,那么我建议使用一种方法,比如,能量守恒的方法,或者高阶龙格-库塔方法,它通常非常精确,以至于你不会注意到错误。但是,您已经在强制实施圆形轨道,而不是让物理引擎计算轨道。因此,只需覆盖物理引擎的计算,并强制对象位于轨道上您知道它应该位于的位置。一种方法是将旧的位移从行星中心旋转一个角度,即(Time.deltaTime/period)*2pi弧度。这并不完美,因为可能会累积一些舍入错误。另一种可能是跟踪原始位置和原始时间,并根据当前时间和原始时间之间的差异计算更改的角度


另一种可行的方法是记住半径应该是多少,并将行星中心的位移重新标准化,使其大小等于所记住的半径。

“那么请解释一下为什么会出现这种情况?”-您的代码中有很多浮点计算,我认为浮点精度是这里的魔鬼。另一件事可能是碰撞的影响,导致您的游戏对象的距离是变化非常小。“变通方法”-可以使用Mathf.Round限制浮点十进制值。“可能的解决方案”-当与行星轨道的对撞机碰撞时,只检查一次,得到r的值并单独进行轨道运行。无需检查每帧的距离或FixedUpdate()等,因为数学函数很重。实际上我正在尝试这样做,但还有另一个问题:物体进入轨道一小会儿,然后离开轨道。我的逻辑是,当物体撞击行星对撞机时,isOrbit变为真,然后在FixedUpdate中检查这个bool变量,如果是真的,我调用这个函数,我在OnTiggerInter2D上进行了所有距离和r计算,这些变量是全局变量,因此它们直接由CircularBit函数使用。物理引擎不是完全确定的,精度有限。约0.0003个单位的变化如何破坏游戏?你可以直接控制这个物体,你可以调整物理设置,或者你可以重新设计以适应这种变化。好吧,谢谢你的回答,我只是一个高中生,所以我的数学/物理都很有限。现在,我认为你的上一个解很合理,因为我可以得到每个轨道的半径,这是我的完整代码和这个解决方案:,代码很容易理解,但现在我有另一个问题,这是非常奇怪的:我的物体正在移出轨道,而
r
保持不变,速度大小和速度也一样。下面是一张gif图,它解释了我当前的问题:。是的,这个答案解释了为什么会看到对象螺旋形向外,以及如何解决这个问题。我在回答最后一个问题后的评论中对此提出了警告。