Estoy jugando con las órbitas en un simple juego 2-d donde un barco vuela por el espacio y se siente atraído por cosas masivas. La velocidad de la nave se almacena en un vector y la aceleración se aplica a cada cuadro según corresponda, dada la ley de gravitación universal de Newton. Las masas de puntos no se mueven (solo hay 1 en este momento), por lo que esperaría una órbita elíptica.
En cambio, veo esto:
He intentado con órbitas casi circulares, y he intentado hacer que las masas sean muy diferentes (un factor de un millón) pero siempre obtengo esta órbita rotada.
Aquí hay un código (D), para el contexto:
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
fuente
fuente
Respuestas:
El error está en la
fall
función. Tenemosdelta
: un vector desde el pozo hasta el barcoforce
: la magnitud de la gravedad entre estos dos cuerpos.|force|
es G * m1 * m2 / r ^ 2pero
|delta|
ya es r! así que en realidad estás acelerando demasiado rápido. Debe dividirr
nuevamente (básicamente normalizando el vector delta) antes de llamar a acelerar.fuente
Tenga en cuenta que incluso con los errores matemáticos corregidos, está utilizando la integración de Euler (es decir,
velocity += delta
y presumiblementeposition += velocity
), por lo que probablemente obtendrá algunos efectos extraños como la rotación de la elipse orbital con el tiempo, y tal vez la elipse se agrande / menor ya que no se garantiza que la integración de Euler conserve energía.Es posible que desee cambiar a la integración de salto de rana , que ahorra energía y debería funcionar mejor para la mecánica orbital. Además, debe incluir el tiempo de cuadro en sus ecuaciones para que la velocidad de su simulación sea independiente de la tasa de cuadros.
fuente