Có một thuật toán cho một trò chơi bi-a?


14

Tôi đang tìm kiếm thuật toán để tính hướng và tốc độ của các quả bóng trong trò chơi bi-a. Tôi chắc chắn phải có một số loại mã nguồn mở cho việc này vì trò chơi bi-a là một số trò chơi máy tính lâu đời nhất tôi có thể nhớ.

Ý tôi là, khi một quả bóng chạm vào quả bóng khác, tôi cần một thuật toán để tính hướng của cả hai quả bóng. Nó sẽ phụ thuộc vào góc chính xác của nơi chúng va vào nhau và tốc độ.

Tôi muốn thực hành mã hóa Java, vì vậy tôi đang tìm mã hoặc gói java có loại mã này.


2
Tuy nhiên, nếu bạn muốn tự giải quyết nó, có lẽ bạn sẽ cần một số kiến ​​thức về vectơ. May mắn thay, một người nào đó đã đăng một hướng dẫn tuyệt vời về toán học tuyến tính ở nơi khác trên trang web này vào ngày khác.
doppelgreener

có lẽ trang web này có thể giúp bạn archive.ncsa.illinois.edu/Classes/MATH198/townsend/...

Câu trả lời:


8

Mặc dù phát hiện / phản ứng va chạm hình cầu cơ bản khá đơn giản, nhưng việc thực hiện nó đủ chính xác để mô phỏng hồ bơi tốt sẽ khó khăn hơn, vì bạn phải đối phó với quay.

Bạn có biết về sự tồn tại của động cơ vật lý? Một số ví dụ phổ biến là những điều này (và chúng có thể làm được nhiều hơn là chỉ va chạm bóng bi-a). Có lẽ là một lựa chọn tốt để tạo một trò chơi bi-a, nhưng không quá nhiều cho việc học Java ...

Ở dạng 2D

Box2D: http://www.box2d.org

Chipmunk: http://code.google.com.vn/p/chipmunk-physics/

Trong 3D

Bullet: http://bONSphysics.org/

ODE: http://www.ode.org

Nếu bạn đang làm một trò chơi thương mại ngân sách lớn:

Havok: http://www.havok.com


1
Cái nào trong số này là các công cụ vật lý Java?
Ricket

Có các cổng Java hoặc, ít nhất là các ràng buộc cho Box2D, Chipmunk, Bullet và ODE
bluescrn


2

Đối với một trò chơi bi-a đơn giản trong đó spin không được mô hình hóa, thuật toán khá đơn giản.

  1. Để kiểm tra xem có va chạm xảy ra hay không, hãy kiểm tra xem khoảng cách giữa các quả bóng có nhỏ hơn tổng bán kính của chúng không.
  2. Tính mức bình thường của tác động
  3. Tính toán lực tác động dựa trên chênh lệch tốc độ, bình thường, hệ số va chạm và khối lượng
  4. Áp dụng lực tác động lên cả hai quả bóng

Trong mã giả, điều này trở thành:

vector difference = ball2.position - ball1.position
float distance = sqrt(difference)
if (distance < ball1.radius + ball2.radius) {
    vector normal = difference / distance
    //vector velocityDelta = ball2.velocity - ball1.velocity
    vector velocityDelta = ball1.velocity - ball2.velocity

    float dot = dotProduct(velocityDelta, normal)

    if (dot > 0) {
        float coefficient = 0.5
        float impulseStrength = (1 + coefficient) * dot * (1 / ball1.mass + 1 / ball2.mass)
        vector impulse = impulseStrength * normal
        ball1.velocity -= impulse / ball1.mass
        ball2.velocity += impulse / ball2.mass
    }
}

Bạn có thể bỏ khối lượng khỏi thuật toán nếu tất cả các quả bóng có cùng khối lượng và cũng giả sử bán kính không đổi cho tất cả các quả bóng cho trò chơi bi-a, nhưng mã sẽ hữu ích hơn cho bạn mà không cần đơn giản hóa.

Mã này dựa trên hướng dẫn này , nhưng tôi nhớ rằng phép nhân xung không chính xác ở đó.


Nếu chấm nhỏ hơn 0 thì sao? Tôi đã nghiên cứu mã giả này (và cái mà bạn đã liên kết, nhưng cái còn lại kết thúc bằng việc tôi cố gắng lấy bình phương của một số âm - có lẽ đó là vấn đề bạn đã xác định với nó). Chắc chắn bạn muốn tạo ra một kết quả với mỗi bộ vị trí và vận tốc đầu vào?

@Poldie Nếu dấu chấm là âm, các quả bóng đã di chuyển ra xa nhau. Không cần xử lý va chạm trong trường hợp đó.
msell

Tôi vừa gõ phiên bản mã của mình ở đây: ideone.com/DhsAoW và tôi nhận được -0.707 cho các vị trí 110,90 và 100,100, và vận tốc 0,2 và 0, -3. Đây là một vụ va chạm trực diện ít nhiều. (Giả sử kiểm tra phát hiện va chạm dựa trên bán kính ban đầu đã xảy ra).
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.