Visual Basic: obsługa kolizji


(adan2013) #1

Xna framework udostępniało bardzo prostą obsługę kolizji. Jak napisać podobną w Visual Basicu?


(kostek135) #2

Generalnie zależy jak bardzo dokładny chcesz mechanizm. Głownie chodzi o przybliżanie

Dla gier z Atarii wystarczy objąć obiekt najmniejszym prostokątem i tyle. Sprawdzenie czy dwa prostokąty się przecinają zrobi uczeń gimnazjum. Tylko mało to dokładne.

Dla większej dokładności zacznijmy od tego, że bardzo często wykonujemy pierwsze sprawdzenie przesiewające, czyli obiekt przybliżamy kulą, bądź prostopadłościanem, jeśli dwie kule się nie przecinają to mamy fajrant i jest fajnie, można stwierdzić, że nie. Dużo możemy zyskać na obiektach, które są daleko od siebie.

Jeśli taki prosty przesiew nie da nam jedno znacznej odpowiedzi, to proponuje przybliżyć obiekt otoczką wypukłą i próbować przecinać dwie bryły wypukłe to już da całkiem dobre efekty.

Dodatkowo przechodzą przewidywania, znaczy, jeśli obiekt porusza się po np. linii prostej i się nie przecina to znając najbardziej wystające punkty w danych kierunkach, możemy policzyć za ile klatek się przetnie i jeśli nie dojdzie do zmiany ruchu (znaczącej, np. obniżenie 20px na 3 sekundy to pestka), tych wyliczeń się trzymać. Nie obliczać tego czego nie widać na scenie, jeśli to nie jest konieczne. Np. Gothic jeśli chcemy zobaczyć czy miecz “odbija się” od pleców, a nie wsiąka, to liczenie tego m tylko sens jeśli postać jest z kamerą z tyłu.jeśli czegoś nie widać, a pełni tylko wizualny teaser, przestać to wyliczać.

Ogólnie geometria + fizyka.

Dodatkowo możesz jeszcze podzielić obiekt na prostsze składowe i przecinać sięz nimi

Dodane 27.08.2013 (Wt) 19:28

Przypomniała mi się jeszcze jedna metoda, ale nie pamiętam jak się nazywa. Wytłumaczę ją w 2D (ale można ją wprost przenieść do 3D) jeśli jakieś obiekty po przesiewie stwierdzają, że nie jest pewne, stosujesz dziel i zwyciężaj. Obejmujesz je (oba obiekty) prostokątem i dzielisz go na k mniejszych kwadratów teraz pytanie czy figury (obie naraz) znajduje się w prostokącie(i,j) jest to też tanio obliczalne z punktu widzenia komputera. Kwadraty w których warunek zaistnienia obu jest prawdziwy (tylko wtedy może dojść do kolizji) dzielisz na mniejsze itd. potem możesz stosować inne z tych co podałem wcześniej, mieszasz i próbujesz, bo takie przybliżanie to tylko heurystyki. Co kogo obchodzi, ze grafiki się trochę czasem wtopią na głębokość kilku pixeli albo miecz nie dojdzie celu a zada obrażenia. Bywa.