Piszę odgórną grę XNA 2d. Od początku staram się pisać fizykę i kolizje, aby się tego nauczyć.
Ilekroć moja postać sprite'a gracza próbuje przejść do pozycji, w której jej granice przecinają się z krawędzią ściany, wymyślam kąt odbicia (kąt padania = kąt odbicia) i zmuszam gracza do odbicia się od ściany i unikania kolizji .
Mam problem z ustaleniem, jak poradzić sobie z sytuacją mojego duszka przecinającego się z dwiema krawędziami ściany jednocześnie, chociaż np. Uderza w narożnik.
Mój kod mówi mi obecnie, że dwie krawędzie ściany zostały przecięte, ale nie wiem, która krawędź uderzyłaby jako pierwsza, a zatem która krawędź odskoczyła.
Jaki jest test matematyczny, aby wybrać, która krawędź ma się odbić? Patrząc na to z łatwością widać, ale staram się wymyślić test matematyczny.
Odpowiedzi:
Jeśli obliczyć, jak daleko w został przeniesiony, prawdopodobnie można oprzeć go na delcie xiy współrzędne narożników, które są przecinające się. Mam nadzieję, że to ma sens, nie mogę wymyślić lepszego sposobu na sformułowanie tego.
Wall
Player Sprite
Na przykład, jeśli spojrzysz na diagram. Weź
x
wartość lewego górnego roguPlayer Sprite
(po przeniesieniu) i odejmijx
wartość prawego dolnego roguWall
. Zrób to samo dlay
wartości, a następnie sprawdź, która z nich jest większa. Kluczem jest to, że jeśli jeden jest większy od drugiego,Player Sprite
prawdopodobnie przecinają się po tej stronie.Oto przykład obrazu (jest to podsekcja twojego obrazu z dodanymi moimi liniami):
Teraz widzisz tutaj, że niebieska linia jest większa niż zielona linia. W tym przypadku niebieska linia znajduje się również po tej stronie, z
Player Sprite
której można się spodziewać odbicia.Jeśli dwie wartości są równe, trafiają w róg.
Teraz jest niewielki problem z robieniem tego w ten sposób. Jeśli
Player Sprite
podróż odbywa się bardzo szybko lub kolizja znajduje się bardzo blisko rogu, możliwe, żePlayer Sprite
może pójść dalejWall
w złym kierunku. W takim przypadku prawdopodobnie będziesz musiał sprawdzić prędkość poruszającego się obiektu. (Zobacz odpowiedź Nathana Reeda ).Uwaga: Myślę, że w zasadzie staram się opisać wykrywanie kolizji SAT, o którym wspomniał @Blau, ale spędziłem dużo czasu na pisaniu tego, więc i tak go opublikuję. Mam nadzieję, że ci to pomoże.
źródło
Minimalne przemieszczenie nie zawsze daje właściwą odpowiedź, dla której krawędzi trafiono jako pierwszą. Rozważ ten przypadek:
Dzieje się tak, gdy prędkość jest na tyle duża, że blok przesuwa się dość daleko podczas jednej klatki. Aby poprawnie wykryć, która krawędź została trafiona jako pierwsza, musisz skonfigurować równanie liniowe, aby rozwiązać czas zderzenia z każdą krawędzią. W tym przypadku opisanym na schemacie PO odpowiednie równania to:
(Zakłada się, że układ współrzędnych X-y, Y-up.) Ogólnie rzecz biorąc, będziesz musiał użyć znaków elementów X i Y player.velocity, aby określić, która para krawędzi musi zostać przetestowana. W każdym razie, po obliczeniu czasów kolizji, wcześniejszą z nich jest kolizja, którą trzeba poradzić.
źródło
Potrzebujesz wykrycia kolizji SAT
Zasadniczo musisz poszukać wektora minimalnego przesunięcia, który został odjęty od jednego z obiektów, aby nie przecinały się.
Na twoim obrazie minimalnym przesunięciem jest pomarańczowy segment.
źródło
Odpowiedziałem na podobne pytanie tutaj
Możesz rozważyć sprawdzenie poprzednich pozycji
Na przykład: jeśli lewa strona znajdowała się wcześniej na prawo od prawej strony i kolidujesz, nastąpiło zderzenie z prawą ręką.
Jeśli to zrobisz, po prostu rozwiąż kolizje osi y, sprawdź, czy kolidujesz z czymś, a następnie rozwiąż kolizje osi x.
źródło