Döndürmenin modellenmediği basit bir bilardo oyunu için algoritma oldukça basittir.
- Bir çarpışma olup olmadığını kontrol etmek için, bilyalar arasındaki mesafenin yarıçaplarının toplamından daha küçük olup olmadığını kontrol edin.
- Etkinin normalini hesapla
- Darbe kuvvetini hız farkı, normal, darbe katsayısı ve kütlelere göre hesaplayın
- Her iki topa da darbe kuvveti uygulayın
Sahte kodda bu:
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
}
}
Tüm toplar aynı kütleye sahipse ve aynı zamanda bir bilardo oyunu için tüm toplar için sabit yarıçap varsa, kütleyi algoritmadan çıkarabilirsiniz, ancak kod bu basitleştirmeler olmadan sizin için daha yararlı olacaktır.
Kod bu öğretici dayanmaktadır , ancak dürtü çarpma orada yanlış olduğunu hatırlıyorum.