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.
Antworten:
Sie benötigen eine ordnungsgemäße clientseitige Vorhersage .
Sie sollten den Link, den Roy T. Ihnen in seinem Kommentar gegeben hat, wirklich ausführlich lesen . Es beschreibt, was mit Spielereingabe und Charakterphysik zu tun ist, aber das Prinzip für "servergesteuerte Physik" bleibt dasselbe.
Dies ist nicht trivial zu implementieren, aber in wenigen Worten für Spielobjekte, die synchron sein müssen:
Also ja, Sie gehen mit Ihrer Methode 2 in die richtige Richtung. Es reicht jedoch nicht aus, nur die Werte zu überschreiben. Sie erhalten Sprünge auf dem Client. Sie müssen lediglich reibungslos und kontinuierlich auf die Serverwerte interpolieren.
Für Ihren eigentlichen Fehler bin ich mit Bullet nicht vertraut, aber Ihnen fehlen wahrscheinlich einige Werte, z. B. Sie haben die linearen und Winkelgeschwindigkeiten eingestellt, aber haben Sie die Beschleunigungen eingestellt?
quelle
Was ich persönlich mache, ist, wer auch immer das Spiel hostet, erstellt die Phsyics-Welt und synchronisiert Objekte mit den Kunden. Auch wenn es sich um ein P2P-Netzwerkschema handelt, stütze ich die Physik-Engine immer noch auf einen der Clients des Players.
Andere Physik, die ich benutze und die nur eine Augenweide ist, muss nicht einmal synchronisiert werden.
In einem Prototyp namens "Boilerzerker", den ich vor einiger Zeit erstellt habe, habe ich Physik auf dem Host ausgeführt, und Partikeleffekte (auch unter Verwendung von Physik) wurden nicht über ein Netzwerk synchronisiert, sondern für jeden Client unabhängig, da sie eine Augenweide waren.
quelle
Es ist unmöglich, netzsynchrone Physikwelten zu implementieren. Kleiner Unterschied in Schritt N natürlich viel größerer Unterschied in Schritt N + 1 Sie können keine Kräfte oder Impulse anwenden, um die Synchronität aufrechtzuerhalten und realistisch auszusehen.
Lösungen: -
Sie können in Betracht ziehen, nur wenige Objekte wie Charaktere oder Rennwagen zu synchronisieren, insbesondere wenn diese kinematisch sind. Aber der größte Teil der Welt wäre nicht synchron, um realistisch auszusehen.
Sie können eine Physikwelt auf dem Server haben und Objektpositionen und -geschwindigkeiten an Clients senden.
quelle