Я играю с орбитами в простой 2-ой игре, где корабль летает в космосе и притягивается к массивным вещам. Скорость корабля сохраняется в векторе, и ускорение применяется к нему в каждом кадре в зависимости от обстоятельств, учитывая закон всемирного тяготения Ньютона. Точечные массы не двигаются (сейчас их всего 1), поэтому я бы ожидал эллиптическую орбиту.
Вместо этого я вижу это:
Я пробовал с почти круговыми орбитами, и я пытался сделать массы совершенно разными (в миллион раз), но я всегда получаю эту повернутую орбиту.
Вот некоторый (D) код для контекста:
void accelerate(Vector delta)
{
velocity = velocity + delta; // Velocity is a member of the ship class.
}
// This function is called every frame with the fixed mass. It's a
// method of the ship's.
void fall(Well well)
{
// f=(m1 * m2)/(r**2)
// a=f/m
// Ship mass is 1, so a = f.
float mass = 1;
Vector delta = well.position - loc;
float rSquared = delta.magSquared;
float force = well.mass/rSquared;
accelerate(delta * force * mass);
}
mathematics
physics
orbit
Nathon
источник
источник
Ответы:
Баг в
fall
функции. У нас естьdelta
: вектор из скважины на корабльforce
: величина гравитации между этими двумя телами.|force|
это G * m1 * m2 / r ^ 2но
|delta|
уже г! так что вы на самом деле ускоряетесь слишком быстро. Вам нужно снова разделить наr
(в основном, нормализуя дельта-вектор) перед вызовом ускорения.источник
Обратите внимание, что даже с исправленными математическими ошибками вы используете интеграцию Эйлера (то есть
velocity += delta
и предположительноposition += velocity
), поэтому вы, вероятно, получите некоторые странные эффекты, такие как вращение орбитального эллипса во времени и, возможно, увеличение эллипса / меньше, поскольку интеграция Эйлера не гарантирует сохранения энергии.Возможно, вы захотите переключиться на интеграцию скачка лягушки , которая является энергосберегающей и должна работать лучше для орбитальной механики. Кроме того, вы должны включить в свои уравнения время кадра, чтобы скорость моделирования не зависела от частоты кадров.
источник