Estou tentando implementar um sistema físico de cliente / servidor usando o Bullet, mas estou tendo problemas para sincronizar as coisas.
Eu implementei um estado de movimento personalizado que lê e grava a transformação dos meus objetos de jogo e funciona localmente, mas tentei duas abordagens diferentes para jogos em rede:
- Objetos dinâmicos no cliente que também estão no servidor (por exemplo, detritos não aleatórios e outras coisas sem importância) são tornados cinemáticos. Isso funciona corretamente, mas os objetos não se movem muito bem
- Os objetos são dinâmicos nos dois, mas após cada mensagem do servidor que o objeto foi movido, defino a velocidade linear e angular para os valores do servidor e chamo btRigidBody :: continueToTransform com a transformação no servidor. Também chamo btCollisionObject :: enable (true); para forçar a atualização do objeto.
Minha intenção com o método 2 era basicamente fazer o método 1, mas seqüestrar o Bullet para fazer a previsão de um pobre, em vez de fazer o meu para suavizar o método 1, mas isso não parece funcionar (por razões que não são 100% claras para eu mesmo percorrendo Bullet) e os objetos às vezes acabam em lugares diferentes.
Estou indo na direção certa? O Bullet parece ter seu próprio código de interpolação embutido. Isso pode me ajudar a melhorar o método 1? Ou meu código do método 2 não está funcionando porque estou acidentalmente pisando nisso?
EDIT: Outro problema com o método 1 que acabei de notar é que a resposta à colisão estará muito longe de colisões contra objetos não sincronizados. Os corpos cinéticos meio que disparam coisas até o infinito às vezes, uma vez que não podem ser repelidos.