Thêm lực cản không khí vào phương trình quỹ đạo bóng golf


10

Tôi đang phát triển một trò chơi golf 2D trong VB.NET 2005, nhưng tôi bế tắc về cách thực hiện kéo không khí hoặc gió sẽ ảnh hưởng đến quả bóng.

Tôi đã có những phương trình cho đạn:

  • v0 cho vận tốc ban đầu của một quả bóng golf khi đánh hoặc bắn
  • Các thành phần dọc và ngang vận tốc của quả bóng golf: started

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Khoảng cách dọc và ngang của quả bóng golf: started

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

Làm cách nào để thêm lực cản không khí vào phương trình này để ảnh hưởng chính xác đến vận tốc của quả bóng golf? Tôi không biết làm thế nào để làm điều đó, có ai đã làm việc với các phương trình tương tự không?

Câu trả lời:


10

Tôi không chắc liệu thậm chí còn tồn tại một dạng đóng cho kéo hay gió, nhưng nó khá dễ dàng để mô phỏng theo kiểu thông minh từng bước (giống như tất cả các thư viện vật lý làm):

  1. đặt điều kiện ban đầu của bạn:

    x,y,vx,vy(for t=0)
  2. cập nhật vị trí:

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

    (trong đó dt là thời gian trôi qua kể từ lần cập nhật cuối cùng, còn gọi là thời gian delta)

  3. tính toán những người trợ giúp vận tốc:

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

    |v|v

  4. tính toán lực kéo:

    fdrag=c×v2

    (trong đó c là hệ số ma sát nhỏ! )

  5. tích lũy lực lượng:

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

    mass

  6. cập nhật vận tốc:

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

Về cơ bản đó là Phương pháp của Euler để tính gần đúng các vật lý đó.


Một chút nữa về cách mô phỏng theo yêu cầu trong các bình luận:

  • (t=0)

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

Về cơ bản, nó giống như trong công thức quỹ đạo cơ bản của bạn trong đó mọi lần xuất hiện của t được thay thế bằng 0.

  • KE=0.5m(V2)tv2

  • PE=m×g×y

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

  • (x,y)t1t2t1<t2t1t2

Mã giả:

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

Cảm ơn bạn rất nhiều vì điều này, tôi sẽ thử trả lại cho bạn.
Smith

từ các phương trình bạn đã cung cấp, tôi muốn nhận X & Y hiện tại trong một thời gian nhất định, tôi có nên thay Vo của mình bằng V_x và Vo bằng v_y không? Ngoài ra nếu tôi cần thêm KE ban đầu mà quả bóng được bắn, điều này KE=0.5*m*(V*V)có hợp lệ không?
Smith

@Smith Tôi sẽ chỉnh sửa câu trả lời của tôi để giải thích cho câu hỏi của bạn
Jonas Bötel

đây chính xác là những gì tôi đã làm và x luôn âm, tại sao?
Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.