Я работаю над игрой, в которой мне нужно реализовать некоторую космическую физику, такую как орбиты и гравитация....
Моя основная проблема заключается в том, что я не могу правильно сделать орбиту 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 здесь, но любое предложение сработало.
Пожалуйста, помогите мне, объяснив, почему это не работает в физике для начинающих, я застрял в этом на всю неделю.