Je joue avec des orbites dans un simple jeu en 2-D où un navire vole dans l'espace et est attiré par des choses massives. La vitesse du navire est stockée dans un vecteur et une accélération lui est appliquée à chaque image, selon la loi de Newton de la gravitation universelle. Les masses ponctuelles ne bougent pas (il n'y en a qu'une en ce moment), je m'attends donc à une orbite elliptique.
Au lieu de cela, je vois ceci:
J'ai essayé avec des orbites presque circulaires, et j'ai essayé de rendre les masses très différentes (un facteur d'un million) mais j'ai toujours cette orbite tournante.
Voici un code (D), pour le contexte:
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
la source
la source
Réponses:
Le bug est dans la
fall
fonction. On adelta
: un vecteur du puits au navireforce
: l'ampleur de la gravité entre ces deux corps.|force|
est G * m1 * m2 / r ^ 2mais
|delta|
c'est déjà r! vous accélérez donc trop vite. Vous devez diviser àr
nouveau (normaliser fondamentalement le vecteur delta) avant d'appeler accelerate.la source
Notez que même avec le (s) bogue (s) mathématique (s) corrigé (s), vous utilisez l' intégration d'Euler (c'est-à
velocity += delta
- dire et probablementposition += velocity
), donc vous allez probablement obtenir des effets étranges comme la rotation de l'ellipse orbitale au fil du temps, et peut-être que l'ellipse s'agrandit / plus petit car l'intégration d'Euler n'est pas garantie pour économiser l'énergie.Vous voudrez peut-être passer à l' intégration de saute-mouton , qui économise l'énergie et devrait mieux fonctionner pour la mécanique orbitale. En outre, vous devez inclure le temps de trame dans vos équations afin que la vitesse de votre simulation soit indépendante de la fréquence d'images.
la source