Estoy buscando un algoritmo para calcular la dirección y la velocidad de las bolas en un juego de billar. Estoy seguro de que debe haber algún tipo de código fuente abierto para esto, ya que los juegos de billar son algunos de los juegos de computadora más antiguos que puedo recordar.
Quiero decir, cuando una pelota golpea a otra, necesito un algoritmo para calcular la dirección de ambas. Dependerá del ángulo exacto de dónde se golpean y de la velocidad.
Quiero practicar la codificación Java, por lo que estoy buscando un código o paquete Java que tenga este tipo de código.
Respuestas:
Si bien la detección / respuesta de colisión esfera-esfera básica es bastante simple, hacerlo con la precisión suficiente para una buena simulación de grupo sería más complicado, ya que tendrías que lidiar con el giro.
¿Eres consciente de la existencia de motores de física? Algunos ejemplos populares son estos (y pueden hacer mucho más que solo colisiones de bolas de billar). Probablemente sea una buena opción para hacer un juego de billar, pero no tanto para aprender Java ...
En 2D
Box2D: http://www.box2d.org
Chipmunk: http://code.google.com/p/chipmunk-physics/
En 3D
Bullet: http://bulletphysics.org/
ODE: http://www.ode.org
Si estabas haciendo un juego comercial de gran presupuesto:
Havok: http://www.havok.com
fuente
Puede que le interese el artículo " Lecciones de la sala de billar: detección rápida y precisa de colisiones entre círculos o esferas " si elige ir por la ruta "rodar su propio". No es específico de Java, pero discute algunos de los algoritmos involucrados para una simulación simple.
fuente
Para un juego de billar simple donde el giro no está modelado, el algoritmo es bastante simple.
En pseudocódigo esto se convierte en:
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í.
fuente