Dans un jeu 2D, je veux simplement dessiner la trajectoire d'une flèche en vol. Avec le code ci-dessous, la trajectoire (la parabole) semble droite, mais l'angle (ou la rotation) ou la flèche ne l'est pas.
float g = -9.8f;
float x = (launchVelocity * time);
float y = (launchVelocity * time) + (0.5f * g * (float)Math.Pow(time, 2));
float angle = (float)Math.Tanh(y / x);
Qu'est-ce que je rate? Merci.
projectile-physics
Martin
la source
la source
Réponses:
Arctanh
vous donne la tangente de la courbe hyperbolique! Pour autant que je sache, votre parabole n'est pas une hyperbole.Mais nous avons une bonne nouvelle: trouver la tangente pour votre parabole est plus facile. L'équation est
Où est ton
launchVelocity
. Maintenant, la pente de votre flèche est:Vous pouvez
Arctan
maintenant l' utiliser en toute sécurité si vous le souhaitez.Quelques informations supplémentaires sur la physique:
La trajectoire approximative que vous simulez s'applique au centre de masse de votre flèche. Lorsque vous dites «position» (x, y), vous parlez de la position du centre de gravité. Le centre de gravité d'une flèche est légèrement en avant à partir du milieu et vous devez en tenir compte si vous voulez dessiner la flèche.
Gardez à l'esprit que vous ne considérez pas le moment d'inertie de la flèche (qui peut varier beaucoup si vous tirez une baliste géante) et que vous ne considérez pas la dynamique des fluides de la flèche: le vol de la flèche d'arc ne suivra pas un chemin parabolique!
la source
Vous voulez l'angle de la flèche à tout moment. Vous vous souvenez que pour calculer un angle, il y a une tangente. Mais voici où votre réflexion a commencé à mal tourner:
Ok, donc si vous négligez le frottement de l'air, la vitesse x de la flèche est constante.
Tout d'abord, décomposez la vitesse en composantes x et y. Vous pourriez photographier à un angle de 45 degrés ou 60 degrés. Vous avez donc besoin de launchVelocity et d'un angle, ce n'est pas un scalaire.
Deuxièmement, calculez tout comme double et non flottant. Vous n'êtes pas suffisamment sophistiqué numériquement pour savoir quand une erreur d'arrondi ne vous tuera pas, alors n'essayez pas. Ce n'est pas un grand gain de temps en tout cas.
Troisièmement, n'utilisez pas Math.pow, c'est lent et pas aussi précis que de multiplier pour des puissances entières. Vous pouvez également gagner beaucoup de temps en utilisant le formulaire de Horner (voir ci-dessous)
Si vous cherchez désespérément des performances, vous pouvez même précalculer 0,5 * g, mais le code ci-dessus vous mènera à 90% du chemin sans rien faire de trop fou. Benchmark faisant cela 10 millions de fois si vous le souhaitez, ce n'est certes pas beaucoup de temps, mais en pourcentage, c'est assez grand - les bibliothèques sont très lentes en Java
Donc, si vous vouliez l'angle auquel la flèche devrait aller, ce que vous voulez c'est
Et dans ce cas, cela fonctionnerait parce que dx est une constante. Mais en général, dx peut être nul, vous devez donc généralement utiliser:
qui est une fonction spécialement conçue pour ce travail.
Mais comme je l'ai dit, les fonctions de bibliothèque en Java sont horriblement lentes, et dans ce cas, il y a une meilleure façon de le faire sans comme mentionné par @FxIII ci-dessus.
Si la vitesse horizontale est toujours v0x et la vitesse verticale est:
alors votre delta est: vx, vy
Vous n'avez pas besoin de l'angle. Si vous vouliez dessiner une flèche, utilisez quelque chose nominalement comme:
tracé (x, y, x + vx, y + vy);
Je ne sais pas ce que vous dessinez, donc si vous avez besoin de l'angle pour le faire pivoter (comme vous utilisez JOGL), alors bien sûr, utilisez l'angle.
N'oubliez pas si vous utilisez opengl pour retourner l'angle en degrés, car ATAN2 renvoie des radians:
la source
Tanh () ( tangente hyperbolique ) prend un angle comme paramètre, mais vous lui avez donné le rapport des côtés.
Ce que vous voulez vraiment, c'est utiliser l' arctangente hyperbolique , qui prend le rapport des côtés comme paramètre et renvoie l'angle. (La dénomination peut être "atanh", "atanh2", "arctanh", ou quelque chose de similaire; semble varier beaucoup entre les différentes bibliothèques mathématiques)
la source