Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania bez odpowiedzi
Viewing all articles
Browse latest Browse all 21942

Ciekawy pomysł na algorytm sprawdzania kolizji

$
0
0

Ostatnio chce zrobić funkcje sprawdzającą kolizje AABB. Jeżeli sprawdzałbym kolizje każdego obiektu z każdym to instrukcji do sprawdzenia było by bardzo wiele. Szukając odpowiedzi natrafiłem na sposób polegający na dzieleniu obiektów na strefy aby nie sprawdzać kolizji obiektów z wielu różnych stref. Podczas rozmyślania jak zliczać te obiekty w strefach natknąłem się na pewien pomysł.

Aktualny algorytm sprawdzania kolizji wygląda tak:

Sortuję pozycje X obiektów za pomocą quicksort.

Sprawdzam czy obiekt nr.0 i obiekt nr.1 nie kolidują ze sobą (na osi X)
{ jeżeli nie - obiekt 0 nie koliduje z niczym }
{ jeżeli tak - obiekt 0 koliduje z 1 i może kolidować z innymi obiektami np. 2, 3 i 4
      sprawdzam więc czy nie koliduje z nimi dopóki zwróci false } //później wyjaśnię dlaczego 'dopóki'

{ zbieram grupę obiektów które mogą ze sobą kolidować (strefę) i powtarzam wszystko tylko w osi Y i nie wszystkie ale te ze stref }

Po co to robię:
   

Na początku ustawiam obiekty o pozycji X od najmniejszej do największej.
W tablicy std::vector zwracam się do nich za pomocą cyfr (tablica[1] itp. //na rysunku numerowałem bez zera)

Sprawdzam kolizje obiektu 1 i 2 i zwraca true, więc oba obiekty 'wkładam' do nowego std::vector żeby sprawdzić ich kolizję na osi Y, robię to późnij a teraz kontynuuję. Jeżeli teraz sprawdziłbym kolizje 2 i 3 to nie odkryłbym, że 3 koliduje z 1, więc kiedy tylko 1 koliduje z 2 to sprawdzam kolizję z następnymi tj. 3 i 4, zatrzymuję się na 4 bo 1 nie koliduje z 4 (na rysunku separacja oznaczona zieloną osią). Gdyby 2 kolidowało z 3 to musiałbym się upewnić, że 2 nie koliduje z 4. Aby dokładnie zrozumiałeś o co mi chodzi napiszę ci listę instrukcji

Cyfry będą tu obiektami

sprawdzam 1 i 2 - true
sprawdzam 1 i 3 - true
sprawdzam 1 i 4 - false
ponieważ 1 i 4 to false to wiem, żeby sprawdzić kolizję 1 tylko z 2 i 3, bo z innymi nie ma prawa kolidować
sprawdzam 2 i 3 - false
2 na pewno nie koliduje z 3 więc nie koliduje z niczym innym ( 2 nie koliduje z 1, tylko 1 z 2 smiley)

na koniec sprawdzam czy 3 nie koliduje z 4 - false

wyniki:
1 koliduje na osi X z 2 i 3
      wywołuję sprawdzenie kolizji z 2 - false
      wywołuję sprawdzenie kolizji z 3 - true - 1 koliduje z 3
przy 2, 3 i 4 nie wywołuję sprawdzenia kolizji.

 

Po co to piszę.
Nie wiem jak zaimplementować ten algorytm, nie oczekuję gotowca ale pomoc, poradę, może widzicie tutaj możliwość wykorzystania jakiejś struktury danych, może mój algorytm jest nie efektywny.

Napiszcie, jeżeli są lepsze sposoby sprawdzania kolizji, co sądzicie o moim itd.

Zapraszam do rozmowy, jestem otwarty na rady i krytykę
 


Viewing all articles
Browse latest Browse all 21942

Trending Articles


[Filmy XviD / DivX] Czerwony pająk (2015) [WEBRip] [XviD-B89] [PL] Dodane...


Musierowicz Małgorzata - Noelka [audiobook PL]


Farming Simulator 17 Spolszczenie – Spolszczenie FS 17 PL


Praktyczny Elektronik – Rocznik 1993


1


Sok malinowy


Antena Rybakowa


Stuki na zimnym silniku ( film )


Auta / Cars (2006) PLDUB.BRRip.480p.XviD.AC3-LTN / DUBBING PL


Abradab - Czerwony Album (2004)


AutoMapa 6.27.0 ( 2301 ) Polska / Europe Finał ( PC_WinCE ) Cracked


H. H. Schild - MRI Zrozumieć Rezonans Magnetyczny [PDF] [DJVU] [PL]


Alawar Keygen POLECAM


Kombajn ziemniaczany GRIMME HLS 750


POTANIACZ


Kasowanie inspekcji Hyundai ix35


Wojciech Sawicki SP7GBF - SK


Sprawdź z którą postacią z anime dzielisz urodziny


Peugeot 508 problem z elektroniką


Windows XP Black Edition 8.2 PL