Моделирование эллиптической орбиты

8

Я играю с орбитами в простой 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);
}
Nathon
источник
Ву. yeaaaah. D. модульное тестирование этого математического кода по известным результатам; и все будет хорошо.
замедленная

Ответы:

7

Баг в fallфункции. У нас есть

  1. delta: вектор из скважины на корабль
  2. force: величина гравитации между этими двумя телами.

|force| это G * m1 * m2 / r ^ 2

но |delta|уже г! так что вы на самом деле ускоряетесь слишком быстро. Вам нужно снова разделить на r(в основном, нормализуя дельта-вектор) перед вызовом ускорения.

accelerate(delta * well.mass * mass / rSquared / Math.sqrt(rSquared))
Джимми
источник
4

Обратите внимание, что даже с исправленными математическими ошибками вы используете интеграцию Эйлера (то есть velocity += deltaи предположительно position += velocity), поэтому вы, вероятно, получите некоторые странные эффекты, такие как вращение орбитального эллипса во времени и, возможно, увеличение эллипса / меньше, поскольку интеграция Эйлера не гарантирует сохранения энергии.

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

Натан Рид
источник