17
Detekcja kolizji Stosowanie Detekcja kolizji - to zestaw algorytmów, używanych przy obliczeniach zachowywania ciał dla symulacji fizyki rzeczywistego świata, np. w grach komputerowych, przy modelowaniu maszyn lub zjawisk natury:

Detekcja kolizji

Embed Size (px)

Citation preview

Page 1: Detekcja kolizji

Detekcja kolizjiStosowanie

Detekcja kolizji - to zestaw algorytmów, używanych przy obliczeniachzachowywania ciał dla symulacji fizyki rzeczywistego świata, np. w grachkomputerowych, przy modelowaniu maszyn lub zjawisk natury:

Page 2: Detekcja kolizji

Algorytmy

Żeby sprawdzić czy dwa ciała się dotykają, należy najpierw stworzyć modeltych ciał, czyli opisać ich formę. Formę obiektu można opisać w zależnościod tego, jaki cel chcemy osiągnąć: jeśli nam nie bardzo zależy na tym, żebyobiekt dokładnie reagował na kolizję, możemy bardzo uprościć jego formę,wynikiem czego nadal będzie jakaś reakcja na kolizję, ale ona nie będzie miałapełnej fizycznej dokładności. Natomiast będzie łatwo obliczyć zachowanietakiego obiektu. Tak to jest zrobione między innym w grach - im słabszeurządzenie, na którym działa program - tym mniej obliczeń można robić,żeby, na przykład, zachować baterię.

Przykład: w grach komputerowych często stosują technologię CharacterController. To jest uproszczenie formy bohatera gry do kapsuły:

Page 3: Detekcja kolizji

Przy takim uproszczeniu dość łatwo można wykryć, czy bohater uderzył oschody, czy o ścianę. Tej formy stosują do wykrycia przesuwań bohatera. Naobrazku można zobaczyć wiele innych form (kubów), które również opisująbohatera - ale oni są używani do wykrycia innej części kolizji - na przykład wstrzelance dla wykrycia urażeń. Ale te kuby również nie opisują modelbohatera dokładnie - natomiast są dużym uproszczeniem jego formy.

W takim układzie, model bohatera nie odpowiada swojej modeli fizycznej na100%, ale tego wystarcza, żeby bohater reagował na kolizję ze ścianą czyziemią, na przykład:

Page 4: Detekcja kolizji

Dla większego efektu (w filmach, bajkach, najnowszych grach) oprócz modelikapsuły, osobne części modeli bohatera są opisane przy pomocy swoichniezależnych fizycznych modeli, żeby na przykład ustalić nogę bohatera wpotrzebnym miejscu przy chodzeniu po skosach:

Page 5: Detekcja kolizji

Sprawdzenie przecinania obiektów

Ogólnie mówiąc, żeby sprawdzić zestaw obiektów na przedmiot kolizji /przecięcia / dotkania, należy dla każdej pary obiektów sprawdzić czyprzecinają / dotykają się ich formy (collision shape). Ten algorytm jest ozłożoności  O(n̂2)bo dla każdego z  N obiektów będzie odpalono N - 1 testów kolizji. Możnaprzyspieszyć ten algorytm, rozpraszając go - w przypadku wyłączniedetekcji kolizji to nie stanowi problemu. Ale w rzeczywistości częstonależy w jakiś sposób zreagować na kolizję - zmienić pozycję obiektu lubwyświetlić jakiś efekt.

Page 6: Detekcja kolizji

Więc, im prostszą formę ma obiekt, tym szybszy będzie ten proces.Odpowiednio, im mniej obiektów należy sprawdzić - tym szybszy będzie tenproces.

Forma obiektu

Dla detekcji kolizji należy wiedzieć, gdzie się znajduje obiekt (pozycja) i jakąma formę. Obiekt jest opisany przy pomocy tych dwóch parametrów. Częstoobiekt nie zmienia swojej formy w trakcie działania programu, ale może sięobracać. Ogólnie, obrócony obiekt ma inną formę z matematycznego punktuwidzenia -  obrócony, powiedzmy, prostokąt, opisuje się innym zestawemformuł. W rzeczywistości ten sam obiekt może natomiast mieć trzyparametry - pozycję, kąt obrócenia i formę.

2D

Let's talk about 2D. W dwu-wymiarowej grafice obiekty są płaskie. Dlategoopisanie ich formy nie stanowi dużego problemu. Natomiast, żeby sprawdzićczy dwie różne formy się przecinają, należy opisać algorytmy dlasprawdzania czy dowolny punkt obiektu A dotyka się czy przecina się z dowolnympunktem obiektu B.

W praktyce rzadko stosują takich dokładnych sprawdzań. Natomiast stosująalgorytmy wzajemnego sprawdzania przecięcia podstawowych jednostekform, np. koło-koło, koło-trójkąt, trójkąt-trójkąt. Tych dwóch form itrzech testów wystarczy, żeby wykryć kolizje pomiędzy większościąobiektów w 2D, ponieważ inne formy są kombinacjami z kół czy trójkątów:

Page 7: Detekcja kolizji

KOŁO

Koło jest najprostszą formą dla detekcji kolizji.

Tą formę możemy opisać używając jednego parametru: promieniu. I jakbyśmy nie skręciliśmy koło - ono ma tą samą formę.

Sprawdzenie czy dwa koła się przecinają jest dość łatwe - wystarczyrozwiązać takie równanie:

Page 8: Detekcja kolizji

W przypadku z trójkątem to nie jest taki banał:

Jak widać na zdjęciu - jest dość sporo możliwych pozycji trójkąta odnośniekoła, więc sprawdzenie nie będzie takie łatwe. Jest kilka możliwościimplementacji takiego testu. Można, na przykład, znaleść wszystkie (trzy)długości wektorów normalnych od centru koła do każdej ze stron trójkąta isprawdzić czy długość tego wektoru mniejsza lub równa promieniu koła i czytrafia koniec tego wektoru do odpowiedniej strony trójkątu:

Page 9: Detekcja kolizji

Na obrazku wyżej na zielono pokazany promień koła, na niebiesko - samokoło, na czerwono - wektory normalne do każdej ze stron trójkąta. Jakwidać, każdy z wektorów jest krótszy od promienia koła, ale tylko jeden znich trafia na stronę trójkąta. Więc można stwierdzić, że obiekty przecinająsię:

Dla czego jest warunek trafienia do strony trójkąta:

Tu widać, że jeden z wektorów normalnych jest krótszy od promienia koła,ale nie trafia na stronę trójkąta, do której on jest perpendykularny. Więc niemożna stwierdzić, że trójkąt przecina się z tym kołem.

Ale ten algorytm ma podstawową wadę: nie da się wykryć przy jego pomocytakiej sytuacji:

Page 10: Detekcja kolizji

Każdy z wektorów jest dłuższy od promienia koła, ale wciąż koło jestwewnątrz trójkąta. Żeby usunąć tą wadę, można dodać takie sprawdzenie:czy suma powierzchni trójkątów od wierzchołków zewnętrznego trójkąta docentru koła rowna się powierzchni całego zewnętrznego trójkąta:

Trójkąt

Wyżej już było opisano jak wykryć kolizję między trójkątem a kołem. Wprzypadku dwóch trójkątów można stosować algorytmu sumy powierzchni,jak to było opisano dla koła. Tylko że tym razem trzeba będzie sprawdzić todla każdego wierzchołka trójkąta:

Page 11: Detekcja kolizji

Jedną z ciekawszych sytuacji będzie taka, gdy trójkąty się tylko dotykają:

W takim razie należało by sprawdzić, czy chociażbym jedna ze stron trójkątanie zawiera (części) dowolnej strony innego trójkąta.

Złożone formy

Pozostałe formy obiektów można przedstawić jako kombinację z trójkątówi/lub kół i stosować odpowiednich algorytmów do każdego elementu całości.

Na przykład, prostokąt. Prostokątowa forma obiektu, czyli box shape, możebyć przedstawiona albo jako zestaw z dwóch trójkątów, albo jako prostokąt.

Page 12: Detekcja kolizji

Tylko że wykrycie przecinania prostokąta i innych form będzie bardziejskomplikowane.

Albo kapsuła - to jest kombinacja z dwóch trójkątów i dwóch kół:

Convex & Concave

Istnieje dwa rodzaje form obiektów - wypukłe i wklęsłe. W przypadkuwypukłych obiektów, wykrycie kolizji można przyspieszyć, na przykład,sprawdzając, czy przecinają się granicy obiektów. Albo sprawdzać czy dwaobiekty się przecinają, biorąc pod uwagę w jakiej płaszczyźnie leży obiektodnośnie stron innego obiektu:

Page 13: Detekcja kolizji

 Jeśli obiekt HIJKLM leży w innej płaszczyźnie, niż obiekt ABCDEFG - obisię nie przecinają. Wyliczenie w jakiej płaszczyźnie znajduje się obiektzrobione poprzez wyznaczenie płaszczyzn, zdefiniowanych każdej ze stronobiektu.

Dość ważną formą jest także triangle mesh. To jest taka forma obiektu,która się składa z wielu trójkątów i jest wklęsłą. Dlatego ta forma jestnajtrudniejsza do analizy na przedmiot wykrycia kolizji. W praktyce takichform stosują tak rzadko, jak możliwe ponieważ choć dają one najbardziejdokładny efekt, ale są trudne obliczeniowo. Dlatego takie formy stosują doplansz:

RaycastingCzasem trzeba nie sprawdzić, czy dwa obiekty się przecinają lub dotykają się,

Page 14: Detekcja kolizji

Czasem trzeba nie sprawdzić, czy dwa obiekty się przecinają lub dotykają się,ale czy oni zetkną się w przyszłości. Lub, ewentualnie, sprawdzić odległośćpomiędzy dwoma obiektami. To zadanie rozwiązuje algorytm raycastingu.To jest wykrycie, czy promień, puszczony z punktu A przekroczy się zdowolnym innym obiektem i, jeśli przekroci się, to w jakim punkcie. Przypomocy raycastingu jest możliwe także wyliczenie najkrótszej odległościmiędzy obiektami w pewnym kierunku:

Dla każdego obiektu będzie sprawdzono, czy promień przekrocił formę tegoobiektu.

Znalezenie punktów przekrocenia promienia może być implementowaneprzy użyciu wektorów. Niech mamy formę koła, opisaną promieniem r orazcentrem c i promień, puszczony z punktu o w kierunku l.Wtedy możemy opisać punkt x, który leży na kole i w którym przecina siękoło i promień:

W tym układzie mamy dwie nieznane zmienne: x oraz d. Jeśli przyrównamyoba równania i rozwiążemy ostateczne, zobaczymy:

W przypadku trójkąta, dowolny punkt wewnątrz trójkąta, zdefiniowanego

Page 15: Detekcja kolizji

W przypadku trójkąta, dowolny punkt wewnątrz trójkąta, zdefiniowanegowierzchołkami p1, p2 i p3 można przedstawić parametrycznie:

Dla promienia o długości d, puszczonego z punktu o w kierunku l, mamytrzy nieznane zmienne: u, v oraz d. Istnieje dość szybki algorytm wykryciaistnienia punktu x dla tego przypadku, algorytm Mollera-Trumborea. 

Ciągłe wykrycie kolizji

Wyżej wymienione algorytmy są stosowane do ciągłej detekcji kolizji. Wrzeczywistości uaktualnienie stanu obiektów jest robione dyskretnie, toznaczy że każdy obiekt uaktualnia swoją pozycję, powiedzmy, co N sekund.Ale w świecie rzeczywistym tak się nie dzieje - obiektu ruszają się ciągle. I wprzypadku, gdy obiekt rusza się bardzo szybko, przy następnymuaktualnieniu stanu obiektu na komputerze on pojawi się w co innej pozycjiniż oczekiwane:

Ale w świecie rzeczywistym to bym wyglądało tak:

Page 16: Detekcja kolizji

Dlatego stosują raycastingu - przy poruszaniu obiektu o dużej prętkościnajpierw jest puszczany promień przed tym obiektem i jest sprawdzane, czynależy ten obiekt zatrzymać wcześniej, czy nie.

Miękkie ciała

Czasem jest potrzeba zasymulować miękkie ciało - oponę koła czy piłkę. Tosą ciała, które zmieniają swoją formę kolizji:

Jak można się domyślić, nie jest to łatwe zadanie, więc w celu optymizacjiczęsto stosują technik, które tworzą wrażenie, że ciało jest miękkie, ale niezmieniają rzeczywistej formy obiektu. To jest zrobione przy pomocy stawów(joints) albo sprężyn, które łączą składowe formy obiektu, formując bardzopodobną formę.

Dokładniej to można zobaczyć na tym obrazku:

Page 17: Detekcja kolizji

Tu widać, że i zając i kola są złożone z dużej ilości trójkątów. Każdy z tychtrójkątów jest połączony z innymi przy pomocy niewidocznych sprężyn. Wmomencie, gdy koło uderza się o schody, trójkąty się zbliżają pod wpływemsprężyny i użytkownikowi się wydaje, że koło zmieniło swoją formę.