Ajout d'une traînée d'air à une équation de trajectoire de balle de golf

10

Je développe un jeu de golf 2D dans VB.NET 2005, mais je suis coincé sur la façon de mettre en œuvre une traînée d'air ou de vent qui devrait affecter la balle.

J'ai déjà ces équations pour projectile:

  • v0 pour la vitesse initiale d'une balle de golf lorsqu'elle est frappée ou tirée
  • Composantes verticales et horizontales de la vitesse de la balle de golf:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Distance verticale et horizontale de la balle de golf:

    x=v0cos(θ)ty=v0sin(θ)t(0.5)gt2

Comment puis-je ajouter une traînée d'air à cette équation pour affecter correctement la vitesse de la balle de golf? Je ne sais pas comment faire, est-ce que quelqu'un a travaillé avec des équations similaires?

Forgeron
la source

Réponses:

10

Je ne sais pas s'il existe même une forme fermée pour la traînée ou le vent, mais il est assez facile de simuler par étapes (comme toutes les bibliothèques de physique):

  1. définissez votre condition initiale:

    x,y,vx,vy(for t=0)
  2. position de mise à jour:

    x=x+(vx×dt)y=x+(vy×dt)

    (où dt est le temps écoulé depuis la dernière mise à jour, alias delta time)

  3. calculer ces aides de vitesse:

    v2=(vx)2+(vy)2|v|=v2

    (où représente la longueur de )|v|v

  4. calculer la force de traînée:

    fdrag=c×v2

    (où c est le coefficient de frottement petit! )

  5. accumuler des forces:

    fx=(fdrag×vx|v|)fy=(fdrag×vy|v|)+(g×mass)

    (où la est la masse de votre balle de golf)mass

  6. vitesse de mise à jour:

    vx=vx+fx×dtmassvy=vy+fy×dtmass

C'est essentiellement la méthode d' Euler pour approximer cette physique.


Un peu plus sur la façon dont la simulation comme demandé dans les commentaires:

  • La condition initiale dans votre cas est(t=0)

x=0y=0vx=v0×cos(θ)vy=v0×sin(θ)

C'est fondamentalement la même que dans votre formule de trajectoire de base où chaque occurrence de t est remplacée par 0.

  • L'énergie cinétique est valable pour chaque . Voir comme dans (3) ci-dessus.KE=0.5m(V2)tv2

  • L'énergie potentielle est également toujours valable.PE=m×g×y

  • Si vous voulez obtenir le courant pour un donné , ce que vous devez faire est d'initialiser la simulation pour et de faire de petites mises à jour dt jusqu'à(x,y)t1t=0t=t1

  • Si vous avez déjà calculé pour un et que vous souhaitez connaître leurs valeurs pour un où , tout ce que vous avez à faire est de calculer ces petites étapes de mise à jour dt de à(x,y)t1t2t1<t2t1t2

Pseudo-code:

simulate(v0, theta, t1)
  dt = 0.1
  x = 0
  y = 0
  vx = v0 * cos(theta)
  vy = v0 * sin(theta)
  for (t = 0; t < t1; t += dt)
    x += vx * dt
    y += vy * dt
    v_squared = vx * vx + vy * vy
    v_length = sqrt(v_squared)
    f_drag = c * v_squared
    f_grav = g * mass
    f_x = (-f_drag * vx / v_length)
    f_y = (-f_drag * vy / v_length) + (-f_grav)
    v_x += f_x * dt / mass
    v_y += f_y * dt / mass
  end for
  return x, y
end simulate
Jonas Bötel
la source
Merci beaucoup pour cela, je vais l'essayer et vous recontacter.
Smith
à partir de ces équations que vous avez fournies, je voudrais obtenir les X et Y actuels pour un temps donné (t), dois-je remplacer mon Vo par V_x et Vo par v_y? De plus, si je dois ajouter la KE initiale avec laquelle la balle a été tirée, cela KE=0.5*m*(V*V)sera-t-il valable?
Smith
@Smith, je vais modifier ma réponse pour tenir compte de vos questions
Jonas Bötel
c'est exactement ce que j'ai fait, et x est toujours négatif, pourquoi?
Smith