0

有谁知道处理两个物体引力的教程?例如。一颗卫星被吸引到月球上(并且可能从它身边飞过)。

我有一个我正在开发的小型 Java 游戏,我想在其中实现他的功能。

我有两个物体之间的引力公式,但是当我尝试在我的游戏中使用它时,没有任何反应?

屏幕上有两个物体,其中一个永远静止,另一个则匀速直线运动,直到进入静止物体的检测范围内。在这一点上,它应该被绘制到静止的物体上。首先我计算两个物体之间的距离,根据它们的质量和这个距离,我更新 x 和 y 坐标。

但就像我说的,什么都没有发生。我没有正确执行公式吗?

我已经包含了一些代码来展示我到目前为止所拥有的。这是粒子与门检测范围发生碰撞的情况,应该开始被拉向它

for (int i = 0; i < particle.length; i++)
    {
        // **************************************************************************************************
        //                                          GATE COLLISION
        // **************************************************************************************************
        // Getting the instance when a Particle collides with a Gate
        if (getDistanceBetweenObjects(gate.getX(), particle[i].getX(), gate.getY(), particle[i].getY()) <= 
            sumOfRadii(particle[i].getRadius(), barrier.getRadius()))
        {   

            particle[i].calcGravPull(particle[i].getMass(), barrier.getMass(), 
                    getDistanceBetweenObjects(gate.getX(), particle[i].getX(), gate.getY(), particle[i].getY()));
        }

以及我的粒子类中的方法来做运动

// Calculate the gravitational pull between objects
public void calcGravPull(int mass1, int mass2, double distBetweenObjects)
{   
    double gravityPull;
    gravityPull = GRAV_CONSTANT * ((mass1 * mass2) / (distBetweenObjects * distBetweenObjects));

    x += gravityPull;
    y += gravityPull;
}
4

2 回答 2

1

你的公式有问题。您正在计算重力,然后像加速度一样应用它。加速度是力除以质量,所以你需要用力除以小物体的质量。因此,GRAV_CONSTANT * ((mass1) / (distBetweenObjects * distBetweenObjects))是 mass2 的加速度公式。

然后你使用它就好像它是一个位置调整,而不是一个速度调整(加速度是)。跟踪移动质量的速度,使用它来调整其位置,并使用加速度来改变该速度。

最后,当它实际上是一个向量时,您将加速度用作一个标量。计算从移动质量到静止质量的角度,如果将其表示为与正 x 轴的角度,则将 x 加速度乘以角度的余弦,将 y 加速度乘以角度的正弦。

这将为您提供正确的重力表示。

如果它什么都不做,请检查坐标以查看发生了什么。确保静止质量足够大以产生影响。重力是一种非常微弱的力量,如果比行星质量小得多,您将不会产生明显的影响。

此外,请确保您使用的单位的引力常数正确。您在书中找到的常数适用于 MKS 系统 - 米、千克和秒。如果您使用公里作为长度单位,则需要将常数乘以一百万,或者将长度乘以一千,然后再将其插入公式。

于 2011-04-08T14:52:53.037 回答
-1

你的算法是正确的。您计算的引力可能太小而无法看到。我会删除并重GRAV_CONSTANT试。
顺便说一句,如果您可以加快将结果移动到getDistanceBetweenObjects()临时变量中的速度。

于 2011-04-08T14:28:37.007 回答