Recommandation de moteur physique qui peut simuler correctement le jeu de billard? [fermé]


13

Je fais un jeu de billard comme un jeu. Ce jeu nécessite des rebonds réfléchissants corrects (ou très précis). J'ai essayé Box2D et Bullet Physics , mais ils ont tous les deux ce problème.

Illustration

S'il y a un mur au-dessus de cette image, on s'attend à ce que la ligne rouge représente un vrai ballon dans un jeu de billard. Mais les moteurs montrent souvent une trajectoire de ligne verte. Notamment,

  1. Cela se produit après qu'une balle se déplaçant lentement frappe le mur.
  2. Parfois, une balle qui se déplace rapidement ralentit soudainement.

Je trouve un moteur physique qui peut simuler le jeu de billard avec autant de précision que possible sans ces problèmes. Puis-je obtenir des recommandations? Maintenant, je creuse Newton Game Dynamics , mais je ne suis pas sûr que le moteur affiche ce que je veux. Je considère le PhysX moteur comme essai suivant, et je dois faire mon propre si rien ne fonctionne. Mais il est évident que cela prendra très longtemps, alors je souhaite que je ne le fasse pas. Je serai très apprécié si vous économisez mon temps. Et bien sûr, les solutions avec Box2D / Bullet Physics sont également les bienvenues.

Je travaille avec C / C ++ / Objective + C sur iOS.


J'attache ma configuration avec Box2D.

Des murs

  • forme de boîte statique
  • amortissement linéaire / angulaire = 0,1
  • restitution = 1.0
  • friction = 100
  • densité = 10
  • bullet = false
  • rotation fixe = faux
  • échelle inertielle = 1,0

Des balles

  • forme de sphère dynamique
  • amortissement linéaire / angulaire = 0,1
  • restitution = 1.0
  • friction = 100
  • densité = 20
  • bullet = true
  • rotation fixe = faux
  • échelle inertielle = 1,0

3
il y a de fortes chances que le moteur ne se trompe pas, mais vous n'avez pas défini une propriété ou vous ne l'avez pas fait de façon ou d'autre.
The Communist Duck

doublon possible de Y a
bummzack

J'ai testé avec une densité 1 et un frottement de 0,0 à 0,1, il continue de coller.
Eonil

Réponses:


8

Plusieurs solutions.

  1. Pour Box2D, définissez-le b2_velocityThresholddans un b2Settings.hfichier. Dans mon cas, je l'ai réglé 0.0fet cela a fonctionné! La masse, le frottement, l'amortissement n'étaient PAS un problème. Consultez ce fil de discussion pour plus de détails. http://www.box2d.org/forum/viewtopic.php?f=3&t=6906&p=30782#p30782

  2. Utilisation d'un autre moteur physique. Newton Game Dynamics a configuré cette opération correctement par défaut. Cependant, l'utilisation de la dynamique de Newton dans iOS est possible, mais c'est un peu plus difficile que les autres. J'ai utilisé plusieurs jours pour le configurer pour iOS.

Je pose également la question sur les forums BulletPhysics. Je le mettrai à jour lorsque j'aurai une solution.

-- (Éditer) --

Il y a quelques attributs de seuil dans Bullet, mais je n'ai pas pu trouver exactement la même chose avec b2_velocityThreshold.

Cela semble similaire, mais n'a pas bien fonctionné.

btRigidBody->setContactProcessingThreshold(0.0f)

6

Box2D fera ce que vous voulez, mais vous devez définir les constantes de restitution (rebond) pour les fixations murales et à billes. Pour un jeu de billard, vous voudrez probablement commencer par une restitution parfaite et un frottement élevé mais un amortissement linéaire et angulaire, et peaufiner à partir de là.


J'ai essayé de nombreuses configurations en quelques jours, mais ça arrive quand même. Puis-je obtenir un bon exemple ...?
Eonil

3
Vos valeurs de densité et de frottement semblent très grandes, pour Box2D.

4

Les moteurs physiques ont un seuil de rebond. Je ne sais pas comment le faire dans l'un ou l'autre de ces moteurs, mais le seuil trop élevé le fera ignorer les impacts sous une certaine vitesse. Abaissez le seuil de rebond et il rebondira à des vitesses inférieures.

Je sais que vous avez demandé un moteur physique différent, mais tous les moteurs physiques que je connais utilisent des seuils de rebond pour empêcher les objets de trembler lorsqu'ils sont assis les uns sur les autres. Donc, suggérer un bon moteur physique sera contre-productif car tout bon moteur physique aura cet effet.


0

J'ai eu ce problème et pour moi la solution était de fournir une restitution parfaite.

Donc pour moi, c'est sqrt de 0,5 pour tous les objets. Parce que sqrt (r1 * r1 + r2 * r2) == 1 en situation parfaite.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.