Twierdzenie o separującej osi (SAT) ułatwia określenie minimalnego wektora translacji, tj. Najkrótszego wektora, który może oddzielić dwa kolidujące obiekty. Potrzebuję jednak wektora, który oddziela obiekty wzdłuż wektora, którym porusza się obiekt penetrujący (tj. Punkt styku).
Narysowałem zdjęcie, aby pomóc wyjaśnić. Jest jedno pole, przechodzące od poprzedniej do następnej pozycji. W swojej pozycji po przecina szary wielokąt. SAT może łatwo zwrócić MTV, czyli czerwony wektor. Chcę obliczyć niebieski wektor.
Moje obecne rozwiązanie przeprowadza wyszukiwanie binarne między pozycjami przed i po, dopóki długość niebieskiego wektora nie będzie znana do pewnego progu. Działa, ale jest to bardzo kosztowne obliczenie, ponieważ kolizja między kształtami musi być ponownie obliczana w każdej pętli.
Czy istnieje prostszy i / lub bardziej wydajny sposób na znalezienie wektora punktu kontaktowego?
Odpowiedzi:
To, o czym mówisz, jest dość trudne, jeśli skonstruujesz je jako najpierw ruch obiektu, a następnie testowanie kolizji, a następnie wycofanie się, dopóki nie wyjdziesz z obiektu. Prawdopodobnie lepiej myśleć o tym jako o dynamicznym teście przecięcia : ruchomy obiekt na nieruchomym obiekcie.
Na szczęście testy osi rozdzielających mogą ci w tym pomóc! Oto opis algorytmu, dzięki uprzejmości Rona Levine'a :
Innymi słowy, zapętlasz wszystkie osie, które normalnie robiłbyś w teście statycznej osi oddzielającej. Zamiast wcześnie wychodzić, jeśli nie zauważysz nakładania się, kontynuuj i sprawdzaj rzutowaną prędkość poruszającego się obiektu. Jeśli odsuwa się od obiektu statycznego, wtedy zaczynasz. W przeciwnym razie możesz rozwiązać problem z najwcześniejszym i ostatnim kontaktem dość łatwo (to jeden interwał 1D zbliża się do kolejnego interwału 1D). Jeśli zrobisz to dla wszystkich osi i zachowasz maksymalny czas najwcześniejszego przecięcia i minimalny ostatni czas przecięcia, to wiesz, czy poruszający się obiekt uderzy w obiekt statyczny, a także kiedy. Możesz więc przesunąć poruszający się obiekt dokładnie do momentu, w którym uderzy on w obiekt statyczny.
Oto kilka przybliżonych i całkowicie niezweryfikowanych pseudokodów dla algorytmu:
Oto artykuł Gamasutra mówiący o tym zaimplementowany w kilku różnych prymitywnych testach. Zauważ, że podobnie jak SAT, wymaga to obiektów wypukłych.
Jest to również nieco bardziej skomplikowane niż prosty test osi oddzielającej. Upewnij się, że jest to potrzebne, zanim spróbujesz. Bardzo duża liczba gier po prostu wypycha obiekty ze sobą wzdłuż minimalnego wektora translacji, ponieważ po prostu nie wnikają one głęboko w żadną klatkę i jest prawie niezauważalne wizualnie.
źródło
Chcesz użyć obcinania wielokątów. Najlepiej to wyjaśnić zdjęciami, których nie mam, ale ten facet to zrobił, więc pozwolę mu to wyjaśnić.
http://www.codezealot.org/archives/394
Kolektor kontaktowy zwróci punkt na jednym z obiektów, który jest „najbardziej odpowiedzialny” za kolizję, a nie bezpośredni punkt kolizji. Jednak tak naprawdę nie potrzebujesz tego bezpośredniego punktu kolizji. Możesz po prostu odepchnąć obiekty od siebie przy użyciu głębokości penetracji i normalnej, którą już masz, i użyć kolektora kontaktowego, aby zastosować inne efekty fizyczne (na przykład sprawić, by pudełko przewróciło się / stoczyło w dół zbocza).
Zauważ, że twoje zdjęcie ilustruje mały problem: punkt na niebieskim wektorze, o który prosisz, nie zostanie znaleziony w żadnej fizycznej symulacji, ponieważ tak naprawdę nie trafiłoby to w pole. Pudełko uderzy lewym dolnym rogiem gdzieś w górę stoku, gdy tylko niewielka część narożnika wnika.
Głębokość penetracji będzie względnie mała, a po prostu wypchnięcie pudła ze zbocza wzdłuż normalnej penetracji sprawi, że będzie ono wystarczająco blisko pozycji „prawidłowej”, aby było praktycznie niezauważalne w praktyce, szczególnie jeśli skrzynia ma się odbić, przewrócić lub przesuń się później.
źródło
Wystarczy rzutować wektor MAT na kierunek Vector. Powstały wektor można dodać do wektora kierunku, aby skompensować penetrację. Wyświetlaj to w ten sam sposób, jak na Osi podczas SAT. To ustawia Obiekt dokładnie w pozycji, w której dotyka on drugiego obiektu. Dodaj mały epsilon, aby walczyć z problemami zmiennoprzecinkowymi.
źródło
Jest kilka ostrzeżeń dotyczących mojej odpowiedzi, które jako pierwsze usunę z drogi: dotyczy tylko nieobrotowych obwiedni. Zakłada się, że próbujesz poradzić sobie z problemami z tunelowaniem , tj. Problemami powodowanymi przez obiekty poruszające się z dużą prędkością.
Po zidentyfikowaniu MTV znasz normalną krawędź / powierzchnię, na której musisz przetestować. Znasz również wektor prędkości liniowej przenikającego się obiektu.
Po ustaleniu, że w pewnym momencie w ramce nastąpiło przecięcie, możesz następnie wykonać binarne operacje półetapowe, w oparciu o następujące punkty początkowe: Zidentyfikuj wierzchołek, który penetrował pierwszy podczas ramki:
Po zidentyfikowaniu wierzchołka binarny pół krok staje się znacznie tańszy:
Jest to dość dokładne, ale zapewni tylko jeden punkt zderzenia, w jednym przypadku.
Chodzi o to, że zwykle można z wyprzedzeniem stwierdzić, czy obiekt porusza się wystarczająco szybko na klatkę, aby móc tunelować w ten sposób, dlatego najlepszą wskazówką jest zidentyfikowanie wiodących wierzchołków wzdłuż prędkości i wykonanie testu promieniowego wzdłuż wektora prędkości. W przypadku obracających się obiektów będziesz musiał wykonać binarny krokowy krok pośredni w celu zapewnienia prawidłowego punktu kontaktowego.
Jednak w większości przypadków można bezpiecznie założyć, że większość obiektów w twojej scenie nie porusza się wystarczająco szybko, aby przebić się tak daleko w jednej klatce, więc nie jest konieczne półskokowanie i wystarczające będzie wykrywanie kolizji dyskretnej. Obiekty o dużej prędkości, takie jak pociski, które poruszają się zbyt szybko, aby je zobaczyć, mogą być śledzone promieniami w punktach kontaktowych.
Co ciekawe, ta metoda halfstep może również dać (prawie) dokładny czas wystąpienia obiektu podczas kadru:
Jeśli wykonujesz jakąś rozdzielczość kolizji fizyki, możesz następnie poprawić pozycję A poprzez:
wtedy możesz normalnie wykonywać swoją fizykę. Minusem jest to, że jeśli obiekt porusza się dość szybko, zobaczysz, że teleportuje się z powrotem wzdłuż wektora prędkości.
źródło