Гравитационное притяжение

Кто-нибудь знает учебник, посвященный гравитационному притяжению двух объектов? Например. спутник притягивается к Луне (и, возможно, проходит мимо нее).

У меня есть небольшая 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;
}

person heyred    schedule 08.04.2011    source источник


Ответы (2)


В вашей формуле есть проблемы. Вы вычисляете гравитационную силу, а затем применяете ее, как если бы это было ускорение. Ускорение — это сила, деленная на массу, поэтому вам нужно разделить силу на массу маленького объекта. Следовательно, GRAV_CONSTANT * ((mass1) / (distBetweenObjects * distBetweenObjects)) — это формула ускорения массы2.

Затем вы используете его, как если бы это была регулировка положения, а не регулировка скорости (которой является ускорение). Следите за скоростью движущейся массы, используйте ее, чтобы отрегулировать ее положение, и используйте ускорение, чтобы изменить эту скорость.

Наконец, вы используете ускорение как скаляр, хотя на самом деле это вектор. Вычислите угол между движущейся массой и неподвижной массой, и если вы представляете его как угол от положительной оси x, умножьте ускорение x на косинус угла, а ускорение y на синус угла.

Это даст вам правильное представление о гравитации.

Если это ничего не делает, проверьте координаты, чтобы увидеть, что происходит. Убедитесь, что стационарная масса достаточно велика, чтобы иметь эффект. Гравитация — очень слабая сила, и вы не окажете существенного влияния на массу, намного меньшую, чем планетарная.

Кроме того, убедитесь, что вы используете правильную гравитационную постоянную для единиц, которые вы используете. Константа, которую вы найдете в книгах, предназначена для системы МКС - метры, килограммы и секунды. Если вы используете километры в качестве единиц длины, вам нужно умножить константу на миллион или, наоборот, умножить длину на тысячу, прежде чем подставлять ее в формулу.

person David Thornley    schedule 08.04.2011
comment
Ударь меня. :^) Но я бы рекомендовал не преобразовывать в углы, проще и обычно быстрее получить вектор ускорения из вектора разделения напрямую. - person DSM; 08.04.2011
comment
Большое спасибо за быстрый ответ, похоже, это поможет. Я попробую, когда вернусь домой. - person heyred; 08.04.2011

Ваш алгоритм правильный. Вероятно, вычисляемое вами гравитационное притяжение слишком мало, чтобы его можно было увидеть. Я бы удалил GRAV_CONSTANT и попробовал еще раз.
Кстати, если вы можете ускорить перемещение результата getDistanceBetweenObjects() во временную переменную.

person BlackBear    schedule 08.04.2011