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 )
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ę