Sto cercando di implementare un sistema fisico client / server utilizzando Bullet, tuttavia ho problemi a sincronizzare le cose.
Ho implementato uno stato di movimento personalizzato che legge e scrive la trasformazione dai miei oggetti di gioco e funziona localmente ma ho provato due approcci diversi per i giochi in rete:
- Gli oggetti dinamici sul client che si trovano anche sul server (ad es. Detriti non casuali e altre cose non importanti) vengono resi cinematici. Funziona correttamente ma gli oggetti non si muovono molto bene
- Gli oggetti sono dinamici su entrambi, ma dopo ogni messaggio dal server che l'oggetto si è spostato ho impostato la velocità lineare e angolare sui valori dal server e chiamo btRigidBody ::ceedToTransform con la trasformazione sul server. Chiamo anche btCollisionObject :: activ (true); per forzare l'aggiornamento dell'oggetto.
Il mio intento con il metodo 2 era fondamentalmente di fare il metodo 1 ma dirottare Bullet per fare la previsione di un uomo povero invece di fare il mio per appianare il metodo 1, ma questo non sembra funzionare (per motivi che non sono chiari al 100% anche se passo attraverso Bullet) e gli oggetti a volte finiscono in posti diversi.
Sto andando nella giusta direzione? Bullet sembra avere il proprio codice di interpolazione incorporato. Può aiutarmi a far funzionare meglio il metodo 1? O il mio codice metodo 2 non funziona perché lo sto calpestando accidentalmente?
EDIT: Un altro problema con il metodo 1 che ho appena notato è che la risposta alla collisione sarà molto lontana per le collisioni contro oggetti non sincronizzati. I corpi cinetici in qualche modo sparano all'infinito a volte poiché non possono essere respinti.