重力和向心力

本文关键字:向心力 | 更新日期: 2023-09-27 18:19:34

我正在Unity 3d中制作一个应用程序,我想自己对重力和向心力进行编码,但我得到了奇怪的结果,我做得对吗?这是我的代码:

public void Attract(MassObject[] _allMass)
{
    Vector3 F = new Vector3();
    Vector3 C = new Vector3();
    foreach(MassObject i in _allMass)
    {
        // gravity pull
        F.x = GV.gravity * ((mass * i.mass) / (obj.position.x - i.obj.position.x));
        F.y = GV.gravity * ((mass * i.mass) / (obj.position.y - i.obj.position.y));
        F.z = GV.gravity * ((mass * i.mass) / (obj.position.z - i.obj.position.z));
        // centripital force
        C.x = (mass * Mathf.Pow(vel.x,2)) / (obj.position.x - i.obj.position.x);
        C.y = (mass * Mathf.Pow(vel.y,2)) / (obj.position.y - i.obj.position.y);
        C.z = (mass * Mathf.Pow(vel.z,2)) / (obj.position.z - i.obj.position.z);
    }
    vel = F + C;
    Debug.Log(F);
    Debug.Log(C);
}

重力和向心力

这有一些问题:

  1. 在每次foreach迭代中,都要重写FC,因此最终会为列表中的最后一个对象使用for。应该使用+=而不是=将所有力相加。

  2. 您应该使用矢量运算,而不是手动计算xyz。这样做会使第三个错误更加明显:

  3. 这个公式是错误的。例如,这一行:

    F.x = GV.gravity * ((mass * i.mass) / (obj.position.x - i.obj.position.x));
    

    只替换了一些东西就是

    F.x = gravity coeff * (masses multiplied) / (distance **on the x axis** between objects.)
    

    你真正需要的是物体之间的距离,而不仅仅是在x轴上。你可以通过矢量运算得到这个:

    float distanceSquared = (obj.position - i.obj.position).sqrMagnitude;
    

    然后你可以用万有引力定律得到重力的大小:

    float forceMagnitude = GV.gravity * (mass * i.mass) / distanceSquared;
    

    最后,你需要一个方向。你可以通过向量减法和归一化,然后乘以所需的幅度:

    Vector3 force = (i.obj.position - obj.position).normalized * forceMagnitude;
    

    现在force是从obj指向i.obj的向量,具有两个物体之间的重力大小。把它加到F上,积累来自每个物体的力,事情就会好起来。

  4. 如果vel是速度,那么把它设为两个力的和是错误的。不过,我认为你最好从其他地方了解这一点。理解牛顿定律是一个良好的开端。

相关文章: