Ich versuche, ein Client / Server-Physiksystem mit Bullet zu implementieren, habe jedoch Probleme, die Synchronisierung durchzuführen.
Ich habe einen benutzerdefinierten Bewegungsstatus implementiert, der die Transformation von meinen Spielobjekten liest und schreibt und lokal funktioniert. Ich habe jedoch zwei verschiedene Ansätze für vernetzte Spiele ausprobiert:
- Dynamische Objekte auf dem Client, die sich ebenfalls auf dem Server befinden (z. B. keine zufälligen Trümmer und andere unwichtige Dinge), werden kinematisch dargestellt. Dies funktioniert korrekt, aber die Objekte bewegen sich nicht sehr reibungslos
- Objekte sind auf beiden dynamisch, aber nach jeder Nachricht vom Server, dass sich das Objekt bewegt hat, setze ich die Linear- und Winkelgeschwindigkeit auf die Werte vom Server und rufe btRigidBody :: continueToTransform mit der Transformation auf dem Server auf. Ich rufe auch btCollisionObject :: activ (true) auf; um das Objekt zur Aktualisierung zu zwingen.
Meine Absicht mit Methode 2 war es, im Grunde genommen Methode 1 zu machen, aber Bullet zu entführen, um die Vorhersage eines armen Mannes zu machen, anstatt meine eigene zu machen, um Methode 1 zu glätten, aber dies scheint nicht zu funktionieren (aus Gründen, die nicht 100% klar sind Ich trete sogar durch Bullet) und die Objekte landen manchmal an verschiedenen Orten.
Gehe ich in die richtige Richtung? Bullet scheint einen eigenen Interpolationscode zu haben. Kann mir das helfen, Methode 1 besser zu machen? Oder funktioniert mein Code für Methode 2 nicht, weil ich das versehentlich stampfe?
BEARBEITEN: Ein weiteres Problem mit Methode 1, das ich gerade bemerkt habe, ist, dass die Kollisionsantwort bei Kollisionen mit nicht synchronisierten Objekten weit entfernt ist. Kinetische Körper schießen manchmal bis ins Unendliche, da sie nicht zurückgestoßen werden können.