Laboratoria dotyczą wykrywania i reakcji na kolizję gracza z elementami świata.
Wykrywanie kolizji jest rzeczą zupełnie odrębną od renderowania sceny. Wymaga własnoręcznego zaimplementowania całego mechanizmu: przechowywania informacji o obiektach (bryłach na potrzeby wykrywania kolizji - nie muszą wcale pokrywać się z tym, co jest rysowane!), algorytmów wykrywania czy zaistniała pomiędzy obiektami kolizja (obliczenia matematyczne), oraz algorytmów służących do uzyskania pożądanej reakcji na zaistniałe kolizje (zmiana kierunku ruchu, wybuch, uszkodzenie, zdobycie punktów...).
OpenGL nie służy do wykrywania kolizji, nie będzie tutaj pomocny. Wykrywanie kolizji należy napisać własnoręcznie.
Prezentowana tutaj przykładowa implementacja powinna służyć jako inspiracja. Zamiast zwyczajnie kopiować ją do swojego projektu, należy ją przeanalizować, dostosować do swojej gry, udoskonalić.
Elipsoida
Gracz jest reprezentowany przez elipsoidę. Jest to o tyle wdzięczna bryła, że za pomocą prostej transformacji przestrzeni świata możemy doprowadzić do sytuacji, w której elipsoida staje się kulą o promieniu długości 1. Wówczas wszelkie obliczenia stają się dużo prostsze, a jednocześnie sama bryła (po powrocie do pierwotnej przestrzeni) wciąż pozwala nam na przybliżenie gracza w sposób "wydłużony" w pionie, co jest często przydatne w realnych zastosowaniach. Dodatkowo, kształt ułatwia "wspinanie się" po niewielkich przeszkodach, schodach i pochyłych powierzchniach.

Elipsoidę definiujemy za pomocą długości trzech promieni, odpowiadających kolejno osiom układu współrzędnych (w wersji przykładowej - współrzędnych świata, nieobracających się wraz z graczem, przez co Rx i Rz powinny być równe).
Przykładowy projekt
Projekt (GKiW_Lab6) przedstawia implementację systemu dynamicznego wykrywania kolizji elipsoidy z wielokątami (w załączonej scenie - z czworokątami). Jest to w niewielkim stopniu zmodyfikowana implementacja techniki opisanej przez Fauerby'ego (Improved Collision detection and Response). Gracz ma możliwość swobodnego poruszania się po terenie ograniczonym ścianami. Może też wspiąć się na niewielką przeszkodę.
Użycie tej implementacji obsługi kolizji w swojej grze będzie skutkować bardzo wnikliwymi pytaniami nt. sposobu jej działania, które padną podczas oddawania projektu. To nie jest gotowe rozwiązanie, tylko przykład!
Sposób reakcji na kolizje jest niedoskonały. Praktycznie we wszystkich grach stosuje się w tym obszarze różnego rodzaju uproszczenia i hacki, jak np. każdorazowe odsuwanie o stały offset od powierzchni ściany. Zachęcam do podjęcia próby rozwinięcia całego algorytmu tak, aby reakcje były pozbawione nieprzyjemnego skakania przy jednoczesnym braku możliwości napotkania tzw. efektu tunelowania, czyli niepoprawnego przechodzenia przez przeszkody (przy odpowiednim rozmachu i uniwersalności zaproponowanego rozwiązania, mogłaby z tego powstać przyzwoita praca inżynierska).
Cały projekt z racji swojej większej złożoności posiada bardziej rozwiniętą niż dotychczasowo architekturę. Jego struktura opiera się na idei użycia sceny jako podstawowego elementu hierarchii elementów świata oraz wprowadzenia posiadającego wspólny korzeń drzewa klas dla wszystkich elementów świata. Jest to podejście, które daje dużo większą elastyczność kodu i możliwość jego łatwej rozbudowy. Polecam zastosowanie podobnego (lub lepszego) rozwiązania w swoich projektach.
Materiały