Гравитационное притяжение - PullRequest
0 голосов
/ 08 апреля 2011

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

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

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

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

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

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

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

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

0 голосов
/ 08 апреля 2011

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

...