¿Recomendación de motor de física que puede simular el juego de billar correctamente? [cerrado]

13

Estoy haciendo un juego de billar como juego. Este juego requiere rebotes reflectantes correctos (o muy precisos). Probé Box2D y bala Física , pero ambos tienen este problema.

Ilustración

Si hay una pared encima de esta imagen, se espera una línea roja en el curso de una pelota real en un juego de billar. Pero los motores a menudo muestran un curso de línea verde. Especialmente,

  1. Esto sucede después de que una bola que se mueve lentamente golpea la pared.
  2. A veces una bola que se mueve rápidamente se vuelve más lenta de repente.

Estoy encontrando un motor de física que puede simular el juego de billar con la mayor precisión posible sin estos problemas. ¿Puedo obtener algunas recomendaciones? Ahora estoy cavando Newton Game Dynamics , pero no estoy seguro de que el motor muestre lo que quiero. Estoy considerando el motor PhysX como una próxima prueba, y tengo que hacer el mío si nada funciona. Pero es obvio que tomará mucho tiempo, así que desearía no hacerlo. Seré muy apreciado si me ahorras tiempo. Y, por supuesto, la solución con Box2D / Bullet Physics también es bienvenida.

Estoy trabajando con C / C ++ / Objective + C en iOS.


Adjunto mi configuración con Box2D.

Paredes

  • forma de caja estática
  • amortiguación lineal / angular = 0.1
  • restitución = 1.0
  • fricción = 100
  • densidad = 10
  • bala = falso
  • rotación fija = falso
  • escala inercial = 1.0

Pelotas

  • forma de esfera dinámica
  • amortiguación lineal / angular = 0.1
  • restitución = 1.0
  • fricción = 100
  • densidad = 20
  • bala = verdadero
  • rotación fija = falso
  • escala inercial = 1.0
Eonil
fuente
3
Lo más probable es que el motor no esté equivocado, pero no ha configurado una propiedad o no está funcionando de alguna manera.
El pato comunista
posible duplicado de ¿Hay un algoritmo para un juego de billar?
bummzack
Probé con densidad 1 y fricción 0.0 ~ 0.1, sigue pegándose.
Eonil

Respuestas:

8

Varias soluciones

  1. Para Box2D, establecer b2_velocityThresholden el b2Settings.harchivo. En mi caso, lo configuré 0.0fy funcionó. Masa, fricción, amortiguación NO fueron un problema. Consulte este hilo de discusión para más detalles. http://www.box2d.org/forum/viewtopic.php?f=3&t=6906&p=30782#p30782

  2. Usando otro motor de física. Newton Game Dynamics configuró realizar esto correctamente por defecto. Sin embargo, es posible usar la dinámica de Newton en iOS, pero es algo más difícil que otros. Utilicé varios días configurándolo para iOS.

También estoy preguntando en los foros de BulletPhysics. Actualizaré esto cuando tenga una solución.

- (editar) -

Hay algunos atributos de umbral en Bullet, sin embargo, no pude encontrar exactamente lo mismo con b2_velocityThreshold.

Esto se ve similar, pero no funcionó bien.

btRigidBody->setContactProcessingThreshold(0.0f)
Eonil
fuente
6

Box2D hará lo que quiera, pero debe establecer las constantes de restitución (rebote) para los accesorios de pared y bola. Para un juego de billar, probablemente desee comenzar con una restitución perfecta y una alta fricción, pero con amortiguación lineal y angular, y ajustar desde allí.


fuente
Probé muchas configuraciones en pocos días, pero aún sucede. ¿Puedo obtener un buen ejemplo ...?
Eonil
3
Sus valores de densidad y fricción parecen muy grandes, para Box2D.
4

Los motores de física tienen un umbral de rebote. No sé cómo hacerlo en ninguno de esos motores, pero el umbral que se establece demasiado alto hará que ignore los impactos a cierta velocidad. Baje el umbral de rebote y rebotará a velocidades más bajas.

Sé que pediste un motor de física diferente, pero todos los motores de física que conozco usan umbrales de rebote para evitar que los objetos vibren cuando están sentados uno encima del otro. Por lo tanto, sugerir un buen motor de física será contraproducente ya que cualquier buen motor de física tendrá este efecto.

Brandon
fuente
0

Tuve este problema y para mí la solución fue proporcionar una restitución perfecta.

Entonces para mí eso es sqrt de 0.5 para todos los objetos. Porque sqrt (r1 * r1 + r2 * r2) == 1 en situación perfecta.

Weston
fuente