Chociaż nie pracowałem specjalnie z silnikiem fizyki pocisków, zrobiłem coś bardzo podobnego w innym silniku fizyki. Sposób, w jaki to rozwiązałem, polegał na ustawieniu prędkości liniowej ciała sztywnego zamiast bezpośredniego tłumaczenia. Ruch i kolizje były następnie automatycznie obsługiwane przez fazę aktualizacji silnika fizyki.
Z dokumentacji wynika, że istnieje btRigidBody::setLinearVelocity
metoda, której można użyć. Na przykład, jeśli nie chcesz, aby miały miejsce żadne przyspieszenia, po prostu ustaw prędkość liniową na odpowiednią wartość za każdym razem, gdy postać się porusza, i ustaw ją z powrotem na (0,0,0), kiedy postać ma się zatrzymać (tj. kiedy gracz zwolni klawisz).
Jeśli chodzi o to, jakich wartości użyć, typowym podejściem byłoby rozpoczęcie od pożądanej prędkości twojej postaci (jako liczby zmiennoprzecinkowej / skalarnej), a następnie pomnożenie jej przez znormalizowany wektor, który wskazuje w kierunku, w którym chcesz się poruszać. Z tego, co widzę, btVector3
klasa ma już metody do tego wszystkiego.
Alternatywnie możesz rozważyć potraktowanie postaci jako kompletnego obiektu fizyki i obsługę ruchu za pomocą metod applyForce
lub applyImpulse
. Spowodowałoby to przyspieszenie ciała, więc twoje postacie będą miały pęd, a wyniki prawdopodobnie będą wyglądać ładniej w ten sposób. Ale musisz podjąć dodatkowe środki, na przykład upewniając się, że prędkość liniowa nigdy nie przekracza określonego limitu, albo poprzez zaciskanie go, albo zabawę z tłumieniem / tarciem. Będzie to więc trudniejsze do wdrożenia i dokładniejszego.
Eksperymentuj z obiema metodami, a następnie wybierz tę, która zachowuje się najbliżej twoich potrzeb.
Dla przypomnienia, moje doświadczenie z fizyką polega na korzystaniu z Chimpunk w silniku gier 2D, ale jestem pewien, że ta koncepcja dobrze przekłada się na 3D.
Zakładam, że twoja postać jest ciałem fizycznym o wadze i tym podobnych. Najlepszym sposobem na to jest bardzo uproszczona symulacja chodzenia. Pomyśl o tym w ten sposób: jeśli stoisz, twoje stopy mają duże tarcie, więc nie tylko się ślizgasz. Kiedy się poruszasz, w przybliżeniu odpowiada to usunięciu tarcia (ponieważ nie opierasz się ruchowi stopami) i przyłożeniu siły kierunkowej. Ja nie mówiąc, że należy indywidualnie symulować każdą stopę pchającą na ziemi - ciało sztywne jest to, co chcesz.
Oto, gdzie trochę się komplikuje:
Jeśli odpowiednio wyregulujesz swoją siłę i tłumienie, zastosowanie siły zawsze zapewni najbardziej realistyczny wynik, szczególnie jeśli postać będzie popychać przedmioty. Tłumaczenie będzie najgorszym sposobem na to, ponieważ silnik fizyki tak naprawdę nie uważa tego za ruch. Bezpośrednie ustawienie prędkości jest nieco lepsze, ale z mojego doświadczenia wynika, że najlepsze wyniki można uzyskać za pomocą siły i tłumienia.
Mam nadzieję, że wyjaśniłem to wystarczająco dobrze. Zapytaj, czy potrzebujesz wyjaśnień. :)
źródło
W przypadku punktu 2.87 wydaje się, że właściwą metodą jest wywołanie zwrotne zaznaczenia, które aktualizuje się z wewnętrzną częstotliwością aktualizacji symulacji (być może wielu 100 Hz), a setWorldTransform () na obiektach kinematycznych płynnie aktualizuje pozycję:
Ta część znajduje się w instrukcji:
Ta część była trudniejsza do zrozumienia:
To była pomocna dokumentacja w btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h :
setLinearVelocity () nie działa dla obiektów kinematycznych (być może kiedyś we wcześniejszych wersjach?). Ale świat dynamiki zrozumie setWorldTransform () i wywołania getLinearVelocity () na obiekcie kinematycznym zwrócą prędkość ustawioną w wywołaniu zwrotnym tiku (prawdopodobnie zwraca średnią, jeśli prędkości te miałyby się zmienić z wewnętrznego tiku na tik).
https://github.com/bulletphysics/bullet3/issues/1204 - plakat z problemami ma dobry pomysł, ale odpowiedź nie jest pomocna.
źródło