Wdrożyłem prosty silnik fizyki gier 3D. Mam już przyzwoite wykrywanie kolizji, teraz próbuję wymyślić część odpowiedzi na kolizję. Używam metody opartej na impulsach do obliczania prędkości po zderzeniu. Działa to całkiem dobrze, jednak nie całkowicie uniemożliwia ciałom wzajemne przenikanie się. Mam więc dodatkowy fragment kodu, aby rozwiązać problem penetracji. Obecnie po prostu przesuwam ciała wzdłuż kontaktu normalnego o połowę głębokości penetracji - pierwsze ciało w kierunku normalnego kontaktu, drugie ciało w przeciwnym kierunku.
Jest to w porządku przez większość czasu, ale są pewne niepożądane efekty. Na przykład wyobraź sobie wąski korytarz i poruszający się przez niego obiekt. Jeśli obiekt uderza w jedną ze ścian korytarza, rozdzielczość penetracji przenosi go do przeciwległej ściany, a następnie w następnej ramce z powrotem do pierwszej ściany i tak dalej. Efekt jest taki, że obiekt bardzo szybko wibruje między ścianami, co nie jest ładne.
Moje pytanie brzmi więc, czy istnieje lepszy sposób na rozwiązanie problemu penetracji? Być może nie poruszaj ciałami, po prostu dostosuj ich prędkości (oprócz obliczeń impulsowych), aby przestały się zbliżać, a penetracja ustąpi w następnych kilku klatkach. Po prostu zgaduję tutaj. Jakieś pomysły?
Sprawdź ten artykuł - który został tu opublikowany wiele razy, po prostu przeszukaj pytania i odpowiedzi dotyczące wykrywania kolizji - pokazuje, jak wykonać „ciągłą” rozdzielczość kolizji, o której mówił Stephelton:
http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3
Zasadniczo rozwiązujesz niektóre podstawowe równania kinematyczne dla dokładnego punktu czasowego, kiedy twoje dwa obwiednie zaczynają się przecinać. Rozwiązujesz kolizje dokładnie w tym momencie, a następnie kontynuujesz pozostały czas w ramce. Być może będziesz musiał ponownie zasymulować, co dzieje się po chwili zderzenia, ponieważ prędkości / przyspieszenia twoich obiektów ulegną zmianie. Ale i tak jest twój punkt wyjścia ... na zdrowie!
źródło