重力和向心力
Gravity and Centripetal Force
我正在 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);
}
这有一些问题:
您在每次 foreach
迭代中重写 F
和 C
,因此您最终得到列表中最后一个对象的 for。您应该使用 +=
而不是 =
.
将所有力加在一起
您应该使用矢量运算而不是手动计算 x
y
和 z
。这样做会使第三个错误更加明显:
公式有误。例如,这一行:
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
以累积每个物体的力,事情应该是好的。
你对物理学的理解可能有问题。如果 vel
是速度,则将其设置为两个力的总和是错误的。不过,我认为您最好从其他地方了解这一点。理解牛顿定律是一个好的开始。
我正在 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);
}
这有一些问题:
您在每次
foreach
迭代中重写F
和C
,因此您最终得到列表中最后一个对象的 for。您应该使用+=
而不是=
. 将所有力加在一起
您应该使用矢量运算而不是手动计算
x
y
和z
。这样做会使第三个错误更加明显:公式有误。例如,这一行:
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
以累积每个物体的力,事情应该是好的。你对物理学的理解可能有问题。如果
vel
是速度,则将其设置为两个力的总和是错误的。不过,我认为您最好从其他地方了解这一点。理解牛顿定律是一个好的开始。