8
votes

Mise en œuvre du mouvement de projectile

J'ai marqué Internet pour des sources et j'ai trouvé beaucoup d'informations utiles, mais ce sont des sites mathématiques essayant de me dire comment résoudre quel angle un objet doit être à atteindre votre emplacement. Cependant, j'essaie d'exécuter une simulation et je n'ai trouvé aucune équations solides pouvant être mises en œuvre pour coder pour simuler une courbe parabolique. Peut-on avoir une connaissance de la physique m'aider à ce sujet?


2 commentaires

Qu'en est-il du frottement de l'air (Windage)?


Pour la simplicité, je vais dire non. Cela vient de compliquer des choses pour l'instant :)


4 Réponses :


6
votes

N'utilisez pas les équations pour la position. Au lieu de cela, utilisez les équations pour la vitesse. Calculez la nouvelle vélocité chaque boucle de votre simulation de la vélocité ancienne de l'objet et appliquez-la à votre objet. Vous devrez connaître le temps écoulé entre chaque boucle de la simulation. Bien sûr, cela fonctionne pour une vitesse verticale ou horizontale.

a = F / mass


6 commentaires

Merci pour cette avance. Je vais continuer à vérifier certaines équations.


Je viens de jouer au jeu Gorilla ... et aspiré dessus :(


position_new = position_old + v_new * delta_time; Nan. Cela ne fonctionne pas, car la vélocité n'est pas constante pendant l'intervalle de temps. En fait, l'accélération n'est pas non plus, à moins que vous ne tombiez simplement sur l'objet. Retour à la planche à dessin. Jetez un coup d'œil à la réponse de Phelekicks si vous êtes coincé.


@Jive: l'accélération est constante si vous négligez la résistance de l'air et d'autres points de subtiliser. . . C'est juste l'accélération due à la gravité. Ceci est vrai si vous le laissez tomber ou le jeter - la différence entre les deux est juste la vitesse initiale. Il est vrai que la vitesse n'est pas constante, mais si vous choisissez votre intervalle de temps suffisamment petit, vous pouvez approcher de près la vraie trajectoire avec des segments linéaires (c'est-à-dire une vélocité constante dans chaque segment).


Vous êtes bloqué avec la vitesse de vitesse et de ne pas constante pendant l'intervalle de temps - c'est ainsi que fonctionnent les ordinateurs. Heureusement, les ordinateurs de nos jours sont suffisamment rapides pour utiliser des intervalles de temps suffisants pour pouvoir afficher le mouvement en douceur. C'est pourquoi c'est une simulation et non la vie réelle.


@benny non, vous n'êtes pas coincé avec ça. La réponse acceptée ne présume pas la vitesse fixe lors d'un intervalle de temps, par exemple.



3
votes

Certaines définitions: xxx

Certaines équations: xxx


21 commentaires

Ici, j'appelle la position initiale x = 0 , y = 0 Je néglige également la résistance de l'air et divers autres effets tels que la force de Coriolis en raison de la rotation de la rotation de La Terre - ce qui importerait si, disons, nous parlions de la trajectoire d'un ICBM ou de quelque chose.


Donc, je suppose que j'ajoute VX et VY à X et Y respectivement?


Vous pouvez ajouter VX et VY à la position précédente à chaque étape ou calculez simplement la nouvelle position à l'aide de la formule pour x et Y comme fonction de t .


Incidemment avec calcul intégral, on peut voir que les équations pour x et y sont les équations pour VX et VY intégré au respect de t . Pour cette affaire, les équations pour la vitesse sont juste les intégrales temporelles des équations d'accélération, AX = 0 et ay = -g . Donc, si vous savez comment faire une intégrale, vous n'avez jamais à vous soucier de vous en souvenir - la dérivation est immédiate.


Cela peut être plus que ce que vous vouliez savoir, et si vous ne savez pas que le calcul, n'hésitez pas à l'ignorer, mais je pense que c'est bien d'avoir une certaine compréhension de l'emplacement des équations.


Je mets ces équations dans mon jeu et mon objet se déroule comme prévu. Cependant, comment puis-je l'obtenir pour monter en premier, puis vers le bas (pour atteindre une courbe)?


Donnez-lui une vitesse initiale ( v0 dans mes équations) et choisissez un angle A entre les radians zéro et pi> de sorte que VY> 0 à < Code> t = 0


Mon code finit par être VX = 3 * (flotteur) math.COS (0.785398); et VY = 3 * (flotteur) math.sin (0.785398) - 0.4F * (flotteur) gamétime.elapsedgametime.seconds; - Je reçois toujours le même résultat?


Il semble alors VY est positif jusqu'à ce que "code> environ = 5,3 secondes , ce qui signifie que l'objet se déplace initialement vers le haut. Dis-tu que ce n'est pas le cas?


Oui, un code plus mis à jour de ce que j'ai trouvé ici: Pastebin.com/ghrerxlq


Est-ce que elapsedgametime commence à zéro? Ensuite, VY = 3 * (flotteur) MATH.SIN (0.785398) est initialement un nombre positif. C'est 2.12132 ... Quelle valeur obtenez-vous?


Hmm. J'ai eu zéro. Je l'ai changé à Elaspedgametime.millisecondes et j'ai eu 18 ans, mais maintenant, mon objet ne monte que et ne revient jamais. Ça vous dérange de fouetter un échantillon (ne doit pas être dans C # / XNA) pour que je me penche?


Je me demande si le problème de votre code est en dehors de la pièce que vous avez affichée. . . Puis-je voir quelle est la boucle réelle, et où vous déclarez VX , VY , x et y ? Vous vous êtes assuré que les variables elles-mêmes sont des flotteurs ou quelque chose par opposition aux entiers, non?


Quel est également le changement d'intervalle de temps avec chaque répétition de la boucle? Et quelle est la dernière fois que vous avez mesuré? Il est possible de penser que cela "monte seulement" parce que vous n'avez tout simplement pas regardé assez longtemps pour voir l'accélération descendante Dominez la vitesse initiale vers le haut.


Voici mon code complet (Course sous XNA si vous l'avez): Pastebin.com/snvxycmj


Essayez ceci: VY = 0.3F * (flotteur) math.sin (0.785398) - 2f * (flotteur) gametime.elapsedgametime.milliseconds / 1000f; Si vous utilisez des secondes, comme vous l'aviez à l'origine, alors Effectivement, vous le traitez comme une vitesse constante pour une seconde complète, que je pense est trop longue. Mais si vous utilisez des millisecondes, ce nombre va devenir vraiment très rapide et submergé le terme positif. Vraiment, je pense que vous voulez que votre Unité soit des secondes, mais avec une précision milliseconde, ce qui est ce que Millisecondes / 1000F vous donne.


À moins que je fasse quelque chose de mal, il commence toujours à Y = 0 puis augmente (donc ça tombe). Dois-je envoyer y à une autre position initiale?


Après une considération supplémentaire, je pense que le problème est peut-être que les millisecondes vous donnent simplement la partie millisecondes de l'époque, lorsque vous voulez, c'est le Total écoulés millisecondes. Est elapsedgametime a tispan ? Si tel est le cas, il devrait avoir une propriété totaleMilliseconds , ce que vous voudrez utiliser au lieu de millisecondes .


En d'autres termes, quelque chose comme ceci: VY = 0.3F * (flotteur) math.sin (0.785398) - 2f * (flotteur) gametime.elapsedgametime.totallilliseconds / 1000f;


Ça tombe toujours en panne. Je ne pense pas que ce soit de votre faute, il doit y avoir quelque chose que je fais mal.


Pouvez-vous imprimer une table de valeurs de temps et la valeur correspondante de VY à chacun de ces moments? Des équations vy devrait être positif pour le petit temps et le négatif après cela. . . Si les chiffres sont fausses, voyez quels numéros vous sont vous pouvez aider à déterminer pourquoi.



1
votes

Heres une belle bibliothèque qui pourrait vous aider

http://sites.google.com/site/physics2d/

Je n'ai pas trop examiné cela pour être honnête, je l'ai rencontré dans l'article du projet de code de Scott Whitlock.

http://www.codeproject.com/kb/wpf/soapboxcorepinballdemo.aspx


0 commentaires

8
votes

Alors que la réponse de Benny est bonne, surtout dans sa généralité, vous pouvez résoudre votre problème exactement plutôt que d'utiliser des étapes d'intégration finie. L'équation que vous voulez est la suivante: xxx

Regardez ici pour une explication de l'endroit où cela vient de.

voici ce est le déplacement, u est la vitesse initiale, A est l'accélération et T est l'heure. Cette équation n'est que 1 dimensionnelle, mais peut être facilement utilisée pour votre problème. Tout ce que vous avez à faire est de diviser le mouvement de votre projectile en deux composants: une parallèle à votre accélération et une perpendiculaire. Si nous laissons SX décrivons le déplacement dans la direction X et SY, le déplacement dans la direction Y, nous obtenons: xxx

maintenant dans votre exemple particulier axe est 0 car la seule accélération est En raison de la gravité, qui est dans la direction y, c'est-à-dire ay = -g. Le minimum provient du fait que la gravité agira dans la direction opposée au mouvement d'origine de l'objet. Ux et uy viennent de la simple trigonométrie: xxx

Mettre tout cela ensemble, vous obtenez deux équations décrivant où le projectile sera à la fois après la mise en vente, par rapport à sa position de départ. : xxx


4 commentaires

Sauf si j'ai vraiment foiré à ce sujet, mon gars ne bouge pas du tout. Le code est ici Pastebin.com/zecmtndi- Puis ces valeurs sont ajoutées aux valeurs X et Y.


Le lien ne fonctionne pas. J'imagine que la raison pour laquelle votre gars ne bouge pas est que vous ne mettez pas à jour votre variable de temps T. Donc, sur chaque cadre, vous devriez faire quelque chose comme t + = 0,05;


Eh bien, ma variable de temps est gamétime, laquelle dans XNA représente le temps écoulé entre les cadres ou le temps total écoulé depuis le début du jeu. Ni fonctionne.


Je ne vois pas pourquoi ça ne marcherait pas. Il doit y avoir un problème avec votre code ailleurs. Dans les équations, je vous ai donné qu'il est clair que SX et SY changeront si t change, un objet stationnaire implique donc que votre T ne change pas ou que vous ne mettez pas à jour correctement la position du projectile. J'éviterais d'utiliser Gametime car cela suppose que le projectile est lancé lorsque le jeu commence. Au lieu de cela, une variable t est définie sur 0 au lancement et augmente par une quantité finie sur chaque image, par ex. t + = 0,05