Comment calculer la vitesse de chute et d'accélération?

9

Je pense à faire un jeu d'atterrissage, où vous contrôlez un vaisseau spatial et devez l'atterrir sans s'écraser. Qu'est-ce qu'une formule simple pour calculer la vitesse de chute ou d'accélération par rapport au temps de travail des moteurs temps?

Dvole
la source

Réponses:

28

L'intégration la plus simple est l'intégration d'Euler. Vous devez stocker le vecteur de position et le vecteur de vitesse. À chaque image:

  • mesurer le temps écoulé depuis la dernière étape d'intégration: dt
  • calculer la force de force due à vos moteurs: F
  • calculer le vecteur d'accélération: A = F / m où m est la masse du vaisseau spatial.
  • ajoutez le vecteur de gravité: A = A + G assurez-vous que G pointe vers le centre de la planète
  • mettre à jour le vecteur vitesse V = V + A · dt
  • mettre à jour le vecteur position X = X + V · dt

( x pour les scalaires, X pour les vecteurs)

assurez-vous que dt est petit ...

| G | est d'environ 9,8 m / s² pour la terre et d'environ 1,6 m / s² pour la lune

en général, la force d'actraction due à l'interaction gravitationnelle est:

Loi de Newton sur la gravitation universelle

Elle affecte chaque corps et pointe vers l'autre.

Le scalaire G est la très célèbre constante gravitationnelle, il est d'environ 6,67e-011 N (m / Kg) ²

Puisque vous êtes intéressé par l'accélération:

Accélération

Il vous suffit de connaître la masse (m2) et le rayon (r) de la planète pour calculer votre accélération.

En règle générale, l'accélération qui déplace la planète vers votre vaisseau spatial est négligeable car généralement m1 est négligeable par rapport au m2.

Cependant, si vous essayez d'atterrir sur un petit astéroïde, vous devrez probablement utiliser la formule générale en ajoutant cette force au vecteur de force totale dans la deuxième étape.

ÉDITER:

Au besoin, un indice sur la mise en œuvre. Tu auras besoin de:

  • Une bibliothèque de vecteurs
  • Modèle de moteur
  • Modèle Phisics
  • Détection de collision
  • Interface utilisateur (entrée et rendu graphique)

Tout d'abord la bibliothèque de vecteurs: votre jeu peut être mono / bi / arbre / quatre ... dimensionnel, dans la mesure où vous considérez votre cas comme une projection d'un mot 3D, les roules physiques tiennent.

Si n est la dimension que vous choisissez (probablement 2 ou 3 dans votre cas), la bibliothèque doit avoir:

  • une entité de stockage vectoriel (une liste de n nombres à virgule flottante pour chaque vecteur)
  • un opérateur de somme (somme composante par composante)
  • un opérateur de multiplication scalaire (chaque composant multiplié par un flottant)
  • une multiplication par points entre les vecteurs (multiplier composante par composante et résumer tout)
  • la longueur du vecteur (racine carrée d'un vecteur mutilé par lui-même)

Vous pouvez utiliser une bibliothèque qui le fait ou en implémenter une vous-même; un vecteur peut être une structure ou une classe, le choix vous appartient.

Chaque moteur doit être décrit par:

  • un vecteur indiquant sa force de poussée et sa direction
  • un scalaire qui indique la consommation de carburant par seconde à pleine puissance;

votre entrée utilisateur sera utilisée pour fournir à chaque moteur un nombre compris entre 0 (moteur inutilisé) et 1 (puissance maximale): le facteur (d'utilisation) du moteur.

Multipliez le facteur moteur pour son vecteur de poussée pour obtenir la vraie confiance du moteur et résumer tous les résultats de tous les moteurs disponibles; cela vous donnera le F de la deuxième étape.

Votre facteur moteur peut être utilisé pour connaître la consommation réelle de carburant pour chaque moteur: multipliez le facteur moteur par la consommation de carburant et par dt pour connaître la consommation instantanée de carburant; vous pouvez soustraire cette valeur de la variable de capacité totale de carburant (cela vous donne la possibilité de mettre à jour votre masse totale m si la masse de carburant est considérable).

Vous pouvez maintenant utiliser l'intégration pour calculer la nouvelle position, vérifier la collision avec la surface de votre planète; le cas échéant, utilisez la longueur du vecteur vitesse pour dire si l'atterrissage a été un succès ou une catastrophe.

Évidemment, d'autres vérifications de collision peuvent / devraient être effectuées, certaines entités de surface ne peuvent pas être autorisées comme point d'atterrissage, de sorte que chaque collision est fatale.

Je laisse comment obtenir des commentaires et comment vous rendre votre vaisseau spatial; vous pouvez utiliser le facteur moteur pour afficher l'état du moteur image par image, par exemple.

FxIII
la source
C'est très bien, mais certaines idées sur la façon de le mettre en œuvre dans le code seraient géniales.
Dvole
1
où j'ai appris la physique shiffman.net/teaching/nature
Ming-Tang
Ce mec connaît sa physique!
MGZero
7

Comme l'autre excellente réponse semble un peu théorique, voici la version de code simple:

// Position of the lander:
var positionX =  100.0;
var positionY = 100.0;

// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;

// Acceleration due to gravity
var gravity = 1.0;

// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;

// Thrust acceleration
var thrust = -2.0;

// Vertical position of the ground
var groundY = 200.0;

// Maximum landing velocity
var maxLandingVelocity = 3.00;    

onUpdate()
{
    velocityY += gravity;

    positionX += velocityX;
    positionY += velocityY;

    if (isThrusting)
    {
        velocityY += thrust;
    }

    if (isThrustingLeft)
    {
        velocityX += thrust;
    }
    else if (isThrustingRight)
    {
        velocityX -= thrust;
    }

    if (positionY >= floorY)
    {
        if (velocityY > maxLandingVelocity)
        {
            // crashed!
        }
        else
        {
            // landed successfully!
        }
    }
}
Iain
la source
2
Garder les choses simples. J'espère que cela va dans le sens de ce qu'il cherchait.
Beska
2

Malheureusement, les mathématiques ici deviennent poilues. La réponse de FxIII est bonne pour le cas général d'un objet qui tombe, mais vous parlez d'une fusée - et les fusées brûlent du carburant.

J'ai vu du code qui le fait, mais il était complètement non documenté et je n'ai jamais réussi à comprendre les mathématiques derrière. À moins que vous ne soyez limité en CPU, je ne m'embêterais pas et je ne ferais que le forcer brutalement - l'approche FxIII est appliquée sur une échelle de temps assez courte et ajuste la poussée (ou la consommation de carburant si vous calculez que la fusée ralentit pendant que le carburant brûle pour se maintenir) l'accélération spécifiée plutôt que la poussée spécifiée) entre chaque itération lorsque la fusée brûle du carburant.

Loren Pechtel
la source
Sortir du carburant ne représente qu'un paramètre en baisse. C'est simplement une force vectorielle avec une valeur décroissante. Ai-je tort? Dans un cas simple, vous avez G contre F, où F est le moteur de la fusée et G la gravité de la terre: dans ce cas, vous devez simplement mesurer les deux les uns contre les autres, donc s'il ne reste plus de carburant, F tombe à 0, donc vous seul devez appliquer G comme force vectorielle à votre objet. Fonctionne pour chaque valeur de F. Tant que F> = G, l'objet "doit" se déplacer en direction de F.
daemonfire300
2
@ daemonfire300: Vous vous méprenez - je ne parle pas de l'effet de manquer de carburant, mais de l'effet de la combustion de carburant. Un réglage constant des gaz sur votre moteur produit un chiffre d'accélération en montée continue, une accélération constante produit un taux de consommation de carburant en baisse continue. Cela signifie que les calculs simples fournis par FxIII produiront des chiffres de consommation de carburant incorrects.
Loren Pechtel
La quantité de gain d'accélération de A = F / M à mesure que le carburant est brûlé va être une valeur négligeable à moins que la proportion de la masse de carburant par rapport au véhicule soit absurdement élevée ou que le taux de consommation de carburant soit également élevé. C'est un jeu, après tout.
Patrick Hughes
@Patrick Hughes: La quantité de carburant transportée par tout véritable atterrisseur de fusée (je ne compte pas les cas hybrides aérobrake / fusée de Mars) représente une partie substantielle de son poids total. En supposant que le rapport carburant / accélération à fixer produira une très mauvaise réponse.
Loren Pechtel
1
Ce n'est pas une réponse à la question, juste un commentaire sur la réponse de @ FxIII.
Jonathan Connell