Próbuję wdrożyć system fizyki klient / serwer za pomocą Bullet, ale mam problemy z synchronizacją.
Wdrożyłem niestandardowy stan ruchu, który odczytuje i zapisuje transformację z moich obiektów gry i działa lokalnie, ale wypróbowałem dwa różne podejścia do gier sieciowych:
- Dynamiczne obiekty na kliencie, które również znajdują się na serwerze (np. Nie losowe śmieci i inne nieistotne rzeczy) są kinematyczne. Działa to poprawnie, ale obiekty nie poruszają się bardzo płynnie
- Obiekty są dynamiczne na obu, ale po każdej wiadomości z serwera, że obiekt został przeniesiony, ustawiam prędkość liniową i kątową na wartości z serwera i wywołuję btRigidBody :: progressToTransform z transformacją na serwerze. Wywołuję także btCollisionObject :: Activate (true); aby wymusić aktualizację obiektu.
Moim zamiarem przy metodzie 2 było w zasadzie wykonanie metody 1, ale przejęcie Bulleta w celu wykonania prognozy biedaka zamiast zrobienia własnej w celu wygładzenia metody 1, ale wydaje się, że to nie działa (z powodów, które nie są w 100% jasne ja nawet przechodząc przez Bullet), a obiekty czasami trafiają w różne miejsca.
Czy zmierzam we właściwym kierunku? Wydaje się, że Bullet ma wbudowany własny kod interpolacji. Czy to może mi pomóc ulepszyć metodę 1? A może mój kod metody 2 nie działa, ponieważ przypadkowo go depczę?
EDYCJA: Innym problemem z metodą 1, którą właśnie zauważyłem, jest to, że odpowiedź na kolizję będzie daleka od kolizji z niezsynchronizowanymi obiektami. Ciała kinetyczne czasami strzelają do nieskończoności, ponieważ nie można ich odrzucić.