Я пытаюсь реализовать физическую систему клиент / сервер, используя Bullet, но у меня возникают проблемы с синхронизацией.
Я реализовал собственное состояние движения, которое считывает и записывает преобразование из моих игровых объектов, и оно работает локально, но я пробовал два разных подхода для сетевых игр:
- Динамические объекты на клиенте, которые также находятся на сервере (например, не случайный мусор и другие неважные вещи), становятся кинематическими. Это работает правильно, но объекты движутся не очень плавно
- Объекты являются динамическими на обоих, но после каждого сообщения от сервера о том, что объект перемещен, я устанавливаю линейную и угловую скорость на значения с сервера и вызываю btRigidBody :: continueToTransform с преобразованием на сервере. Я также вызываю btCollisionObject :: activ (true); заставить объект обновить.
Мое намерение с методом 2 было в основном сделать метод 1, но угоня Bullet, чтобы сделать прогноз бедного человека вместо того, чтобы делать мой собственный, чтобы сгладить метод 1, но это, похоже, не работает (по причинам, которые не ясны на 100% я даже перешагнул пулю) и предметы иногда оказываются в разных местах.
Я иду в правильном направлении? Кажется, в Bullet встроен собственный код интерполяции. Может ли это помочь мне сделать метод 1 лучше? Или мой код метода 2 не работает, потому что я случайно топаю это?
РЕДАКТИРОВАТЬ: Другая проблема с методом 1, который я только что заметил, заключается в том, что реакция на столкновение будет далека для столкновений с несинхронизированными объектами. Кинетические тела иногда стреляют в бесконечность, так как их нельзя отбросить назад.