0

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

我正在尝试使用维基百科上的公式使物体在围绕行星的圆形轨道上移动,这里的任何方式都是我的代码:

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 Collidercol是行星轨道的对撞机,当我的物体撞到这个对撞机时,它根据我所做的计算开始以圆形方式移动。

一切都在具有某些条件的固定更新中进行(与本主题无关),我面临的问题是我的距离幅度每帧都在变化,我需要它保持不变!

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

r以下是距离大小的一些值:

4.602833

4.602901

4.603098

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

那么请解释为什么会发生这种情况?

谢谢 。

4

1 回答 1

0

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

这个误差是线性的。如果你有两倍的更新,或者将速度和重力降低两倍,每一步的误差将缩小大约四倍,但由于每个轨道有两倍的更新,额外的距离每个轨道将减少两倍。

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

另一种应该起作用的方法是记住应该是什么半径,并将从行星中心的位移重新归一化,使其大小等于记住的半径。

于 2015-04-20T05:57:53.167 回答