Đố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.
- Để 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.
- Tính mức bình thường của tác động
- 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
- Á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 ở đó.