Empfehlung für eine Physik-Engine, die Pool-Spiele korrekt simulieren kann? [geschlossen]

13

Ich mache ein Pool-Spiel wie ein Spiel. Dieses Spiel erfordert korrekte (oder sehr genaue) Reflexionen. Ich habe Box2D und Bullet Physics ausprobiert , aber beide haben dieses Problem.

Illustration

Befindet sich oben auf diesem Bild eine Wand, wird in einem Poolspiel eine rote Linie im Verlauf eines echten Balls erwartet. Die Motoren zeigen aber oft einen Green-Line-Kurs. Insbesondere,

  1. Dies geschieht, nachdem eine sich langsam bewegende Kugel die Wand berührt.
  2. Manchmal wird eine sich schnell bewegende Kugel plötzlich langsamer.

Ich finde eine Physik-Engine, die Pool-Spiele ohne diese Probleme so genau wie möglich simulieren kann. Kann ich ein paar Empfehlungen bekommen? Jetzt grabe ich Newton Game Dynamics , bin mir aber nicht sicher, ob die Engine zeigen wird, was ich will. Ich überlege mir die PhysX- Engine als nächsten Versuch und muss sie selbst erstellen, wenn nichts funktioniert. Aber es ist offensichtlich, dass es sehr lange dauern wird, und ich wünschte, ich würde das nicht tun. Ich werde sehr geschätzt, wenn Sie meine Zeit sparen. Natürlich sind auch Lösungen mit Box2D / Bullet Physics willkommen.

Ich arbeite mit C / C ++ / Objective + C unter iOS.


Ich hänge meine Konfiguration mit Box2D an.

Wände

  • statische Kastenform
  • lineare / eckige Dämpfung = 0,1
  • Rückerstattung = 1,0
  • Reibung = 100
  • Dichte = 10
  • bullet = false
  • feste Drehung = falsch
  • Trägheitsskala = 1,0

Bälle

  • dynamische Kugelform
  • lineare / eckige Dämpfung = 0,1
  • Rückerstattung = 1,0
  • Reibung = 100
  • Dichte = 20
  • Kugel = wahr
  • feste Drehung = falsch
  • Trägheitsskala = 1,0
Eonil
quelle
3
Die Wahrscheinlichkeit ist groß, dass der Motor nicht falsch ist, aber Sie haben keine Eigenschaft festgelegt oder es irgendwie falsch gemacht.
Die kommunistische Ente
mögliches Duplikat von Gibt es einen Algorithmus für ein Poolspiel?
Mistzack
Ich habe mit Dichte 1 und Reibung 0,0 ~ 0,1 getestet, es bleibt kleben.
Eonil

Antworten:

8

Mehrere Lösungen.

  1. Bei Box2D b2_velocityThresholdin b2Settings.hDatei einstellen . In meinem Fall habe ich es auf gesetzt 0.0fund es hat funktioniert! Masse, Reibung, Dämpfung waren KEIN Problem. Überprüfen Sie diesen Diskussionsthread für weitere Details. http://www.box2d.org/forum/viewtopic.php?f=3&t=6906&p=30782#p30782

  2. Verwendung einer anderen Physik-Engine. Newton Game Dynamics hat dies standardmäßig korrekt konfiguriert. Die Verwendung von Newton-Dynamik in iOS ist zwar möglich, jedoch etwas schwieriger als bei anderen. Ich habe mehrere Tage gebraucht, um es für iOS zu konfigurieren.

Ich frage auch in BulletPhysics-Foren. Ich werde dies aktualisieren, wenn ich eine Lösung habe.

- (bearbeiten) -

Es gibt einige Schwellenattribute in Bullet, mit denen ich jedoch nicht genau dasselbe finden konnte b2_velocityThreshold.

Das sieht ähnlich aus, hat aber nicht gut funktioniert.

btRigidBody->setContactProcessingThreshold(0.0f)
Eonil
quelle
6

Box2D wird tun, was Sie wollen, aber Sie müssen die Restitutionskonstanten (Bounce-Konstanten) für die Wand- und Ballbefestigungen einstellen. Für ein Poolspiel möchten Sie wahrscheinlich mit perfekter Rückstellung und hoher Reibung, aber linearer und eckiger Dämpfung beginnen und von dort aus optimieren.


quelle
Ich habe über einige Tage viele Konfigurationen ausprobiert, aber es passiert immer noch. Kann ich ein gutes Beispiel bekommen ...?
Eonil
3
Ihre Dichte- und Reibungswerte scheinen für Box2D sehr hoch zu sein.
4

Physik-Engines haben eine Sprungschwelle. Ich weiß nicht, wie ich es in diesen beiden Motoren machen soll, aber wenn der Schwellenwert zu hoch eingestellt ist, werden Stöße unter einer bestimmten Geschwindigkeit ignoriert. Senken Sie die Sprungschwelle und es wird mit niedrigeren Geschwindigkeiten springen.

Ich weiß, dass Sie nach einer anderen Physik-Engine gefragt haben, aber alle mir bekannten Physik-Engines verwenden Sprungschwellen, um zu verhindern, dass Objekte zittern, wenn sie aufeinander sitzen. Es ist also kontraproduktiv, eine gute Physik-Engine vorzuschlagen, da jede gute Physik-Engine diesen Effekt hat.

Brandon
quelle
0

Ich hatte dieses Problem und für mich war die Lösung die perfekte Rückerstattung.

Für mich ist das also eine Größe von 0,5 für alle Objekte. Weil sqrt (r1 * r1 + r2 * r2) == 1 in perfekter Situation ist.

Weston
quelle