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