引力

时间:2011-04-08 14:24:11

标签: physics gravity

有没有人知道一个可以处理两个物体引力的教程?例如。一颗被吸引到月球上的卫星(可能还有一个射向它的射门)。

我正在制作一个小型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()));
        }

我的Particle类中的方法来进行移动

// 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;
}

2 个答案:

答案 0 :(得分:1)

你的配方有问题。你正在计算引力,然后将其应用为加速度。加速度是力除以质量,因此您需要将力除以小物体的质量。因此,GRAV_CONSTANT * ((mass1) / (distBetweenObjects * distBetweenObjects))是加速质量2的公式。

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

最后,当它真的是一个向量时,你正在使用加速作为标量。计算从移动质量到静止质量的角度,如果你将其表示为正x轴的角度,则将x加速度乘以角度的余弦值,将y加速度乘以角度的正弦值。 / p>

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

如果没有,请检查坐标以查看发生的情况。确保静止质量大到足以产生效果。重力是一种非常微弱的力量,并且与行星质量相比,它没有明显的效果。

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

答案 1 :(得分:-1)

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