Próbuję wdrożyć system kolizji w tworzonej przeze mnie grze 2D. Twierdzenie o osi oddzielającej (opisane w samouczku dotyczącym kolizji metanetu ) wydaje się wydajnym i niezawodnym sposobem obsługi wykrywania kolizji, ale nie podoba mi się metoda odpowiedzi na kolizję, której używają. Algorytm przesuwając się na oś wzdłuż osi najmniejszego zachodzenia na siebie, po prostu ignoruje poprzednią pozycję poruszającego się obiektu, co oznacza, że nie zderza się on z nieruchomym obiektem tak bardzo, jak wchodzi w niego, a następnie się odbija.
Oto przykład sytuacji, w której miałoby to znaczenie:

Zgodnie z opisaną powyżej metodą SAT prostokąt wyskoczyłby z trójkąta prostopadłego do jego przeciwprostokątnej:

Jednak realistycznie prostokąt powinien zatrzymać się w prawym dolnym rogu trójkąta, ponieważ byłby to punkt pierwszego zderzenia, gdyby poruszał się w sposób ciągły wzdłuż wektora przemieszczenia:

Teraz może to nie mieć znaczenia podczas gry, ale chciałbym wiedzieć, czy istnieje sposób na skuteczne i generalne uzyskanie dokładnych przemieszczeń w ten sposób. Przez ostatnie kilka dni zastanawiałem się nad tym i nie chcę się jeszcze poddawać!
(Przesłane z StackOverflow, mam nadzieję, że nie jest to niezgodne z regułami!)
Krok 1: Dla każdego wielokąta znajdź dwa najdalsze punkty wzdłuż rzutu tego wielokąta na linię prostopadłą do wektora ruchu.
Krok 2: Podziel każdy wielokąt wzdłuż linii łączącej te punkty. Połowa wielokąta zwrócona w stronę drugiego wielokąta wzdłuż wektora ruchu to „kadłub do przodu”. To jedyna część wielokąta, która może się zderzyć.
Krok 3:Rzutuj wektor z każdego punktu na „przedni kadłub” wielokąta wzdłuż wektora ruchu w kierunku przeciwnego wielokąta i sprawdź, czy nie przecina się z każdą krawędzią „przedniego kadłuba” wielokąta. (Prawdopodobnie powoli, ale komputery są obecnie dość szybkie - prawda?) (Przepraszamy za przechyloną strzałkę. Wszystkie strzałki powinny być równoległe.)
Krok 4: Weź najkrótszy wektor. Jest to dokładna odległość kolizji.
Krok 5: Voila!
