Adicionando arrasto aéreo a uma equação de trajetória de bola de golfe

10

Estou desenvolvendo um jogo de golfe 2D no VB.NET 2005, mas estou empolgado em como implementar o arrasto por ar ou vento que deve afetar a bola.

Já tenho essas equações para projétil:

  • v0 0 para a velocidade inicial de uma bola de golfe quando atingida ou disparada
  • Componentes verticais e horizontais a velocidade da bola de golfe:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Distância vertical e horizontal da bola de golfe:

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

Como adiciono arrasto aéreo a esta equação para afetar adequadamente a velocidade da bola de golfe? Eu não tenho nenhuma idéia de como fazê-lo, alguém já trabalhou com equações semelhantes?

Smith
fonte

Respostas:

10

Não tenho certeza se existe um formulário fechado para o arrasto ou o vento, mas é bastante fácil simular passo a passo (como todas as bibliotecas de física):

  1. defina sua condição inicial:

    x,y,vx,vy(for t=0)
  2. atualizar posição:

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

    (em que dt é o tempo decorrido desde a última atualização, também conhecido como tempo delta)

  3. calcule estes auxiliares de velocidade:

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

    (onde representa o comprimento de v )|v|v

  4. calcular força de arrasto:

    fdrumag=c×v2

    (onde c é o coeficiente de atrito pequeno! )

  5. acumular forças:

    fx=(-fdrumag×vx|v|)fy=(-fdrumag×vy|v|)+(-g×mumass)

    (onde é a massa de sua bola de golfe)mumass

  6. velocidade de atualização:

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

Esse é basicamente o método de Euler para aproximar a física.


Um pouco mais sobre como a simulação foi solicitada nos comentários:

  • (t=0)

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

É basicamente o mesmo que na sua fórmula básica de trajetória, onde toda ocorrência de t é substituída por 0.

  • KE=0.5m(V2)tv2

  • PE=m×g×y

  • (x,y)t1t=0t=t1

  • (x,y)t1t2t1<t2t1t2

Pseudo-có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
fonte
Muito obrigado por isso, vou tentar voltar para você.
Smith
a partir dessas equações que você forneceu, gostaria de obter o X&Y atual por um tempo (t), devo substituir meu Vo por V_x e Vo por v_y? Além disso, se eu precisar adicionar a KE inicial com a qual a bola foi disparada, isso KE=0.5*m*(V*V)será válido?
Smith
@Smith Vou editar a minha resposta a conta para suas perguntas
Jonas Bötel
isto é exatamente o que eu fiz, e x é sempre negativo, por que?
Smith Smith