Aggiunta della resistenza aerea all'equazione di una traiettoria della pallina da golf


10

Sto sviluppando un gioco di golf 2D in VB.NET 2005, ma sono bloccato su come implementare la resistenza all'aria o al vento che dovrebbe influenzare la palla.

Ho già queste equazioni per il proiettile:

  • v0 per la velocità iniziale di una pallina da golf quando viene colpito o sparato
  • Componenti verticali e orizzontali la velocità della :

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Distanza verticale e orizzontale della :

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

Come aggiungo la resistenza aerea a questa equazione per influenzare correttamente la velocità della pallina da golf? Non ho idea di come farlo, qualcuno ha lavorato con equazioni simili?

Risposte:


10

Non sono sicuro che esista una forma chiusa per il trascinamento o il vento, ma è abbastanza facile simulare in modo graduale (come fanno tutte le librerie di fisica):

  1. imposta la tua condizione iniziale:

    x,y,vx,vy(for t=0)
  2. posizione di aggiornamento:

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

    (dove dt è il tempo trascorso dall'ultimo aggiornamento, noto anche come delta time)

  3. calcola questi aiutanti di velocità:

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

    (dove rappresenta la lunghezza di )v|v|v

  4. calcolare la forza di resistenza:

    fdrag=c×v2

    (dove c è il coefficiente di attrito piccolo! )

  5. accumulare forze:

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

    (dove è la massa della tua pallina da golf)mass

  6. velocità di aggiornamento:

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

Questo è fondamentalmente il metodo di Eulero per l'approssimazione di quella fisica.


Un po 'di più su come la simulazione è richiesta nei commenti:

  • La condizione iniziale nel tuo caso è(t=0)

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

È sostanzialmente lo stesso della formula di traiettoria di base in cui ogni occorrenza di t è sostituita da 0.

  • L'energia cinetica è valida per ogni . Vedi come in (3) sopra.KE=0.5m(V2)tv2

  • Anche l'energia potenziale è sempre valida.PE=m×g×y

  • Se vuoi ottenere l'attuale per un dato , quello che devi fare è inizializzare la simulazione per ed eseguire piccoli aggiornamenti dt fino at 1 t = 0 t = t 1(x,y)t1t=0t=t1

  • Se hai già calcolato per un e vuoi conoscere i loro valori per un dove , tutto ciò che devi fare è calcolare quei piccoli passi di aggiornamento dt da at 1 t 2 t 1 < t 2 t 1 t 2(x,y)t1t2t1<t2t1t2

Pseudo-codice:

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

Grazie mille per questo, lo proverò e tornerò da te.
Smith,

da queste equazioni fornite, vorrei ottenere l'attuale X e Y per un tempo di risposta (t), devo sostituire il mio Vo con V_x e Vo con v_y? Anche se KE=0.5*m*(V*V)devo aggiungere il KE iniziale con cui è stata lanciata la palla, sarà valido?
Smith,

@Smith Modificherò la mia risposta per tenere conto delle tue domande
Jonas Bötel,

questo è esattamente quello che ho fatto, e x è sempre negativo, perché?
Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.