Comment puis-je intégrer l'élan à ma simulation spatiale?

8

J'essaie de créer un simple moteur physique 2D en ce moment, et je rencontre des problèmes pour trouver comment incorporer l'élan au mouvement d'un vaisseau spatial.

Si je me déplace dans une direction donnée à une certaine vitesse, je suis actuellement en mesure de mettre à jour facilement la position de mon navire (Position + = Direction * Velocity). Cependant, si le navire tourne du tout et que je recalcule la direction (en fonction du nouvel angle auquel le navire fait face) et que j'accélère dans cette direction, comment puis-je prendre en compte l'élan pour modifier la "ligne" que le navire parcourt? Actuellement, le navire change de direction instantanément et continue à sa vitesse actuelle dans cette nouvelle direction lorsque j'appuie sur le bouton de poussée. Je veux que ce soit un mouvement de virage plus progressif afin de donner l'impression que le navire lui-même a une certaine masse.

S'il y a déjà un bon article sur ce sujet, je m'excuse, mais rien n'est apparu dans mes recherches. Faites-moi savoir si d'autres informations sont nécessaires, mais j'espère que quelqu'un pourra facilement me dire comment je peux ajouter la vitesse de masse * à ma mise à jour de la boucle de jeu.

Josh Petite
la source
Si vous cherchez plus à programmer le mouvement, vous voudrez peut-être regarder le jeu gratuit Transcendence, un autre jeu de tir spatial 2D qui utilise cela. Vous pouvez peut-être regarder ses scripts ou demander aux développeurs comment ils l'ont fait
Mastersteviekun

Réponses:

7

Il semble que vous ayez Position et Direction comme vecteurs et Velocity comme scalaire?

Si c'est le cas, changez également Velocity en vecteur et faites quelque chose comme ceci:

Force = Direction * Power
Acceleration = Force / Mass
Velocity += Acceleration * ElapsedTime
Position += Velocity * ElapsedTime

La direction étant un vecteur de longueur unitaire donnant le cap de votre navire. La puissance étant la quantité de poussée que vous souhaitez ajouter (zéro lorsqu'aucune accélération n'est requise)

Si vous voulez en savoir plus, vous pouvez rechercher l'intégration d'Euler

Monsieur Bell
la source
1
Oui et la prochaine étape consiste à modéliser la loi de Newton F = m * a. Ainsi, au lieu d'utiliser une constante "Puissance" pour obtenir une accélération, vous utilisez Accélération = Force / masse. Ainsi, lorsque vous appliquez la poussée, vous l'appliquez comme vecteur de force. Cela vous permettra d'appliquer facilement d'autres forces à votre vaisseau spatial en ajoutant tous les vecteurs de force et en calculant l'accélération correspondante. Cela signifie également que vous pouvez jouer avec Mass en tant que variable distincte.
TerryB
Terry a raison, j'ai oublié d'incorporer cela dans mon message d'origine.
M. Bell
Merci M. Bell / Terry. Les deux équations énumérées ci-dessus m'ont aidé à le faire par programme. J'avais beaucoup de mal à comprendre comment cela fonctionnerait en essayant d'utiliser des flotteurs partout. Après avoir tout passé, mais la masse, aux vecteurs (grâce au leftium ci-dessus), j'ai finalement pu faire fonctionner les choses.
Josh Petite
8

Au lieu de manipuler directement la vitesse , ajoutez une autre variable: l' accélération , qui modifie progressivement et en douceur la vitesse :

De la physique classique ( lois du mouvement de Newton ):

a =  F/m  // a Force will result in a smaller acceleration on objects with more mass
v += a    // acceleration is the rate of change in velocity
p += v    // velocity is the rate of change in position    

où:

a = acceleration, v = velocity, p = position
F = force, m = mass

(Remarque m est la seule valeur scalaire; F, a, v et p sont tous des vecteurs 2D ou 3D)

En outre, il existe en fait deux directions:

  1. La direction à laquelle le navire fait face. La force des moteurs est appliquée le long de ce vecteur.
  2. La direction dans laquelle le navire se déplace (en raison de l'élan). Il s'agit du vecteur vitesse v.

J'ai répondu à une question connexe sur StackOverflow: mouvement 2D des vaisseaux spatiaux . Il y a un exemple de code dans cette réponse.

Leftium
la source
Notez que dans une simulation basée sur les tiques, cette méthode vous donnera des résultats incorrects. Les formules de base sont correctes dans le monde continu de la physique, mais vous devrez effectuer une intégration numérique pour obtenir des résultats précis. Plus de détails ici: gafferongames.com/game-physics/integration-basics
Tetrad
A finalement obtenu ce travail. Merci beaucoup à tous. Il a fallu un certain temps pour comprendre comment analyser cet événement d'entrée avec ma mise à jour (ainsi que l'intégration de l'utilisation du temps).
Josh Petite