Para un juego de billar simple donde el giro no está modelado, el algoritmo es bastante simple.
- Para verificar si ocurre una colisión, verifique si la distancia entre las bolas es menor que la suma de su radio.
- Calcule la normalidad del impacto.
- Calcule la fuerza de impacto en función de la diferencia de velocidad, normal, coeficiente de impacto y masas
- Aplicar la fuerza de impacto a ambas bolas.
En pseudocódigo esto se convierte en:
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
}
}
Puede omitir la masa del algoritmo si todas las bolas tienen la misma masa y también asumir un radio constante para todas las bolas para un juego de billar, pero el código será más útil para usted sin esas simplificaciones.
El código se basa en este tutorial , pero recuerdo que la multiplicación por impulso era incorrecta allí.