Estoy tratando de implementar un sistema físico de cliente / servidor usando Bullet, sin embargo, tengo problemas para sincronizar las cosas.
He implementado un estado de movimiento personalizado que lee y escribe la transformación de los objetos de mi juego y funciona localmente, pero he probado dos enfoques diferentes para juegos en red:
- Los objetos dinámicos en el cliente que también están en el servidor (p. Ej., Desechos no aleatorios y otras cosas sin importancia) se hacen cinemáticos. Esto funciona correctamente pero los objetos no se mueven muy suavemente
- Los objetos son dinámicos en ambos, pero después de cada mensaje del servidor de que el objeto se ha movido, configuro la velocidad lineal y angular a los valores del servidor y llamo a btRigidBody :: proceToTransform con la transformación en el servidor. También llamo btCollisionObject :: activar (verdadero); para forzar al objeto a actualizar.
Mi intención con el método 2 era básicamente hacer el método 1, pero secuestrar a Bullet para hacer la predicción de un hombre pobre en lugar de hacer la mía para suavizar el método 1, pero esto no parece funcionar (por razones que no son 100% claras para incluso cuando paso por Bullet) y los objetos a veces terminan en diferentes lugares.
¿Me dirijo en la dirección correcta? Bullet parece tener su propio código de interpolación incorporado. ¿Puede eso ayudarme a hacer que el método 1 funcione mejor? ¿O mi código del método 2 no funciona porque accidentalmente estoy pisoteando eso?
EDITAR: Otro problema con el método 1 que acabo de notar es que la respuesta de colisión estará lejos para colisiones contra objetos no sincronizados. Los cuerpos cinéticos disparan cosas hasta el infinito a veces, ya que no pueden ser rechazados.