Thấy có bạn làm cái game guny mình cũng muốn làm cái dụ bắn một viên đạn theo hình cầu vồng như trong game ấy, như không biết giải thuật thế nào, có anh chị em nào biết hướng dẫn với?
Giải thuật để bắn một viên đạn như game gunny
Giải thuật gì, kiến thức vật lí lớp 10 thôi
Quỹ đạo của nó có phải parabol không bạn?
Khác cái là ko có sức gió
giải thuật thì có rồi mà làm sao triển khai nhỉ, có viên đạn không mà phức tạp thế?
//V0 là vận tốc ban đầu, t là thời điểm bất kỳ
function lay_toa_do_vien_dan(V0,t){
}
Giải 2 phương trình theo t là tìm được tọa độ đạn còn gì ??
Tại thời điểm bắn xác định được vận tốc sơ cấp + góc bắn =>
Phương trình vận tốc:
vy = vosin(A) - gt;
vx = vocos(A) + awt.
Phương trình tọa độ:
x=vosin(A)t - gt^2 / 2
y = vocos(A)t + awt^2/2.
vo: vận tốc sơ cấp tại thời điểm bắn.
A: góc bắn
g: gia tốc rơi tự do
aw: gia tốc cản của gió.
vx: vận tốc hướng x theo t.
vy = vosin(A) - gt;
vx = vocos(A) + awt.
Vận tốc theo chiều y giảm dần theo chiều y —> Okay
Còn vận tốc theo chiều x lại tăng dần theo thời gian à?
uh còn cái thét mét nữa là nếu không có gió thì viên đạn bay theo chiều x mãi mãi ?
Lại còn một thắc mắc nữa là tại sao trong các công thức trên lại không đề cập đến khối lượng nhỉ, mình thấy vật càng nặng nó rơi càng nhanh?
Vận tốc càng nhanh sức cản không khí càng lớn (tăng theo bình phương vận tốc) nên có giới hạn thôi. Giờ nên tập trung vào mô hình cơ bản trước.
Thế mấy cái game engine của các bạn xài nó không làm sẳn cái này à?
wat, sao không dùng libraries có sẵn, 2D thì có Box2D, 3D thì có Bullet, ODE, Havok đó. Vì nếu sau này bạn có mở rộng ra việc phá hủy địa hình, xử lý movement, collision, bouncing, particle effects thì nhiều khi physics engine nó sẽ bao luôn vụ đó.
Nếu muốn viết từ đầu chỉ để học hỏi thì mình không có ý kiến, nhưng nếu mục đích của bạn không nằm trong việc học thì việc viết từ đầu rất counter-productive.
Hay cho câu " mình thấy vật càng nặng nó rơi càng nhanh" @_@!
Sức cản không khí :v (drag).
uh, mình cũng nhớ: Nếu không có sức cản của không khí thì viên chì và lông ngỗng rơi với tốc độ như nhau; Thí nghiệm này đã được thực hiện tại Tháp gì đó ở Anh…
Trong thực tế viên đạn bay chịu tác động cản của không khí. Gia tốc cản thay đổi theo vận tốc đạn. Nhưng bỏ qua cái này vì ta chỉ viết tương đối chứ không phải đang mô phỏng thí nghiệm vật lý.
Ta chỉ xét đến gió. aw là gia tốc của đạn theo phương Ox mà lực gió tác động lên đạn. Coi như là không đổi đi. Thực tế nó thay đổi theo vận tốc đạn nhưng không xét khó thế làm gì.
Gió ngược Ox thì aw mang dấu âm và ngược lại.
Khi đạn gặp mục tiêu hoặc rơi chạm đất thì kết thúc quá trình bay nên không có chuyện nó bay mãi theo hướng x hay y.
Gió ngược Ox thì aw mang dấu âm và ngược lại.
Mình nghĩ lực ma sát của không khí thì lúc nào cũng tồn tại nếu không Vx sẽ không đổi theo thời gian, gọi là akk
Khi bạn càng muốn giống thực tế thì phương trình của bạn càng phức tạp.
Ví dụ :
Nhiệt độ cao thì không khí loãng -> lực cản/ ma sát giảm <> Nhiệt độ thấp thì không khí “đặc” hơn -> lực / ma sát cản tăng.
Gió không thổi thẳng hướng đạn mà chéo sang 2 bên, lên trên hoặc xuống dưới.
Gió vận tốc không đều.
…
Đó là những cái tồn tại trong thực tế và trong game để xử lý nó rất khó nhưng nó lại không mang lại hiệu quả gì. Trong trường hợp này bạn cần bỏ qua hết chúng và chỉ cần xét tác động của gió-chính là yếu tố bạn muốn đưa vào game. Khi có gió là có lực -> gán cho aw một giá trị cố định tỷ lệ với vận tốc gió. Có gia tốc khác 0 thì vận tốc đạn sẽ luôn thay đổi.
Bỏ qua sức cản không khí.
Vật càng nặng thì lực hấp dẫn càng lớn :
F = G * m / (d * d).
Nhưng ngược lại,để gia tốc (đạt được 1 vận tốc nào đó) 1 vật có khối lượng lớn thì lại cần 1 lực lớn theo công thức :
F = maa;
Từ đó suy ra cùng với 1 khoảng cách , thì các vật có khối lượng lớn hay bé đều có cùng 1 gia tốc khi rơi xuống đất. (a = g ~ 10m/s).
Lấy vector gia tốc của gió, cộng với vector gia tốc trọng trường rồi cộng với vector gia tốc ném là ra thôi (chắc thế )