【问题标题】:Gravity and Centripetal Force重力和向心力
【发布时间】:2015-10-27 19:31:41
【问题描述】:

我正在 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);
}

【问题讨论】:

  • 定义“奇怪的结果”。
  • 我得到 (-0.6, NaN, Infinity)。我不明白如何获得 NaN 或 Infinity。

标签: c# unity3d gravity


【解决方案1】:

这有几个问题:

  1. 您将在每次 foreach 迭代中重写 F 和 C,因此您最终会得到列表中最后一个对象的 for。您应该使用+= 而不是= 将所有力量加在一起。

  2. 您应该使用向量运算而不是手动计算 x y 和 z。这样做会使第三个错误更加明显:

  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;
    

    那么你可以使用law of universal gravitation来获取重力的大小:

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

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

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

    现在force 是一个从obj 指向i.obj 的向量,其中包含两个对象之间的重力大小。将其添加到F 以积累每个对象的力,事情应该是好的。

  4. 您对物理学的理解可能会有所偏差。如果vel 是速度,则将其设置为两个力的总和是错误的。不过,我认为您最好从其他地方了解这一点。了解牛顿定律是一个好的开始。

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多