Формула круговой орбиты не работает в Unity 3D

Я работаю над игрой, в которой мне нужно реализовать некоторую космическую физику, такую ​​​​как орбиты и гравитация....

Моя основная проблема заключается в том, что я не могу правильно сделать орбиту GameObject вокруг планеты (или другого объекта), я пытаюсь сделать это, используя старую известную формулу из учебников по физике:

v = sqrt( G * ((m1 + m2)/r ))

Где v — скорость объекта на орбите, G — константа, m1 и m2 — массы объекта на орбите и планеты, а r — расстояние от центра m1 и m2.

Вот моя реализация:

void circularOrbit(){
    // Get the distance between the two object centers .
    dist = new Vector2 (Planet.renderer.bounds.center.x - renderer.bounds.center.x, Planet.renderer.bounds.center.y - renderer.bounds.center.y);
    r = dist.magnitude;
    tdist = new Vector2 (dist.x, -dist.y).normalized; // 2D vector prependicular to the dist vector .
    float force = Mathf.Sqrt (G * ((mBody + mPlanet) / r)); // Calculate the velocity .
    rigidbody2D.velocity =  tdist * force;


}

Функция circularOrbit вызывается для каждого кадра внутри FixedUpdate, который Unity предоставляет для сценариев физики.

А вот небольшая картинка, которой достаточно, чтобы объяснить мою проблему: http://makeagif.com/i/-JxBG8

Вот также некоторая информация о моих настройках:

  • Масса монстра 1 единица, а масса планеты 5 единиц.
  • Гравитация монстра отключена.
  • G имеет значение 1 (я протестировал много значений, но проблема не устранена)

Наконец, я знаю, что я не первый, кто сделал это, но я много искал на этой неделе, как это сделать, в основном мой код - это порт Box2D с некоторыми настройками и изменениями, я опубликовал вопрос на GameDev.net здесь, но любое предложение сработало.

Пожалуйста, помогите мне, объяснив, почему это не работает в физике для начинающих, я застрял в этом на всю неделю.


person DeltaWeb    schedule 17.04.2015    source источник


Ответы (1)


Перпендикулярные векторы к (x,y) кратны (y,-x), но у вас есть (x,-y). Вы можете проверить, когда два вектора перпендикулярны, по тому факту, что их скалярное произведение x1*x2 + y1*y2 равно 0. (1,2).(1,-2) = -3. (1,2).(2,-1) = 2-2 = 0.

Кстати, я не рекомендую смешивать силу и скорость. Я бы переименовал то, что вы сейчас называете силой, в скорость.

person Douglas Zare    schedule 17.04.2015
comment
Возможно, вы захотите проверить, не заставляют ли ваши размеры шага объект слишком быстро отклоняться от планеты по спирали. Вы можете исправить это несколькими способами, например, отрегулировав положение так, чтобы расстояние от планеты оставалось постоянным, или используя приближение более высокого порядка к уравнениям движения. - person Douglas Zare; 17.04.2015