J'essaie d'implémenter un système physique client / serveur à l'aide de Bullet, mais j'ai des problèmes pour synchroniser les choses.
J'ai implémenté un état de mouvement personnalisé qui lit et écrit la transformation de mes objets de jeu et cela fonctionne localement, mais j'ai essayé deux approches différentes pour les jeux en réseau:
- Les objets dynamiques sur le client qui se trouvent également sur le serveur (par exemple, les débris aléatoires et autres éléments sans importance) sont rendus cinématiques. Cela fonctionne correctement mais les objets ne se déplacent pas très facilement
- Les objets sont dynamiques sur les deux mais après chaque message du serveur indiquant que l'objet a bougé, j'ai défini la vitesse linéaire et angulaire sur les valeurs du serveur et j'ai appelé btRigidBody :: procéderToTransform avec la transformation sur le serveur. J'appelle également btCollisionObject :: activate (true); pour forcer l'objet à mettre à jour.
Mon intention avec la méthode 2 était essentiellement de faire la méthode 1 mais de détourner Bullet pour faire la prédiction d'un pauvre homme au lieu de faire la mienne pour lisser la méthode 1, mais cela ne semble pas fonctionner (pour des raisons qui ne sont pas claires à 100% pour moi même en passant par Bullet) et les objets se retrouvent parfois à des endroits différents.
Suis-je dans la bonne direction? Bullet semble avoir son propre code d'interpolation intégré. Cela peut-il m'aider à améliorer la méthode 1? Ou mon code de méthode 2 ne fonctionne-t-il pas parce que je le piétine accidentellement?
EDIT: Un autre problème avec la méthode 1 que je viens de remarquer est que la réponse de collision sera très éloignée pour les collisions contre des objets non synchronisés. Les corps cinétiques tirent parfois à l'infini car ils ne peuvent pas être repoussés.