Agregar resistencia de aire a una ecuación de trayectoria de pelota de golf

10

Estoy desarrollando un juego de golf 2D en VB.NET 2005, pero no sé cómo implementar la resistencia del aire o del viento que debería afectar la pelota.

Ya tengo estas ecuaciones para proyectil:

  • v0 para la velocidad inicial de una pelota de golf cuando es golpeada o disparada
  • Componentes verticales y horizontales, la velocidad de la pelota de golf:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Distancia vertical y horizontal de la pelota de golf:

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

¿Cómo agrego arrastre de aire a esta ecuación para afectar adecuadamente la velocidad de la pelota de golf? No tengo idea de cómo hacerlo, ¿alguien ha trabajado con ecuaciones similares?

Herrero
fuente

Respuestas:

10

No estoy seguro si incluso existe una forma cerrada para arrastre o viento, pero es bastante fácil de simular paso a paso (como lo hacen todas las bibliotecas de física):

  1. establece tu condición inicial:

    x,y,vx,vy(for t=0)
  2. posición de actualización:

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

    (donde dt es el tiempo transcurrido desde la última actualización, también conocido como tiempo delta)

  3. calcule estos ayudantes de velocidad:

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

    (donde representa la longitud de )|v|v

  4. calcular la fuerza de arrastre:

    fdrag=c×v2

    (donde c es el coeficiente de fricción pequeño! )

  5. acumular fuerzas:

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

    (donde es la masa de tu pelota de golf)mass

  6. velocidad de actualización:

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

Ese es básicamente el método de Euler para aproximar esas físicas.


Un poco más sobre cómo la simulación solicitada en los comentarios:

  • La condición inicial en su caso es(t=0)

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

Básicamente es lo mismo que en su fórmula de trayectoria básica donde cada aparición de t se reemplaza por 0.

  • La energía cinética es válida para cada . Ver como en (3) arriba.KE=0.5m(V2)tv2

  • La energía potencial también es siempre válida.PE=m×g×y

  • Si desea obtener la corriente para un determinado , lo que debe hacer es inicializar la simulación para y hacer pequeñas actualizaciones de dt hasta(x,y)t1t=0t=t1

  • Si ya calculó para un y desea conocer sus valores para un donde , todo lo que necesita hacer es calcular esos pequeños pasos de actualización de dt de a(x,y)t1t2t1<t2t1t2

Pseudocódigo:

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
fuente
Muchas gracias por esto, lo intentaré y nos pondremos en contacto contigo.
Smith
de estas ecuaciones que proporcionó, me gustaría obtener el X e Y actual para un tiempo determinado (t), ¿debería reemplazar mi Vo con V_x y Vo con v_y? Además, si necesito agregar el KE inicial con el que se disparó la pelota, ¿ KE=0.5*m*(V*V)será válido?
Smith
@Smith Editaré mi respuesta para responder a sus preguntas
Jonas Bötel
esto es exactamente lo que hice, y x siempre es negativo, ¿por qué?
Smith