Próbuję zaimplementować twierdzenie o osi oddzielającej w języku C #. Mam funkcję, która może obliczyć minimalny wektor translacji między dwoma wielokątami. Nie mogę jednak stworzyć funkcji, która oblicza minimalny wektor translacji między jednym wielokątem a wieloma innymi wielokątami. Szczerze mówiąc, pracuję nad tym od miesięcy i nie jestem bliżej rozwiązania i nie byłem w stanie znaleźć rozwiązania online. Zawsze jest kilka przypadków, które nie zwracają prawidłowego wyniku, co prowadzi do błędów o wysokim priorytecie w mojej grze.
Oto typowe przypadki krawędzi, które nie działają poprawnie:
Czy istnieje dobrze znane rozwiązanie tego problemu? Wszystko, co mogę znaleźć, to ludzie, którzy mówią „po prostu wykonaj SAT na każdym wielokącie”, ale rzadko daje to minimalny wektor translacji.
Każda pomoc byłaby bardzo mile widziana.
źródło
Odpowiedzi:
Idealnie, nie budujesz swojego środowiska z wielokątów. Budujesz go z krawędzi (które być może obliczasz z zestawu wielokątów). Na przykład w twoim pierwszym przykładzie jest jedna ukośna krawędź; w ostatnim przykładzie pudełko spoczywa na pojedynczej poziomej krawędzi.
Fakt, że edytor lub narzędzia używają mniejszych, indywidualnych kształtów do budowania poziomu, nie powinien mieć wpływu na środowisko wykonawcze.
Nieco prostsze podejście po prostu usunie „wewnętrzne” krawędzie kształtów podstawowych. W ostatnim przykładzie pomiędzy polami „podłogowymi” są dwie krawędzie; zignoruj je podczas wykrywania kolizji.
Możesz znaleźć lepsze zdjęcia i pomysły na implementację, czytając rozdział 4.5 (krawędzie i łańcuchy krawędzi) w dokumentacji Box2D .
źródło