Arkanoid 3D krok po kroku III

02.08.2010 - Olgierd Humeńczuk
TrudnośćTrudność

W poprzednich artykułach ( pierwszym i drugim ) nauczyliśmy się wyświetlać podstawowe wielokąty i bryły geometryczne. Dodaliśmy także odrobinę realizmu, wykorzystując podstawowy model oświetlenia biblioteki Open GL. W tym artykule zajmiemy się:

  • renderowaniem planszy, na której toczyć się będzie rozgrywka
  • renderowaniem kuli, którą gracz będzie rozbijał rozmieszczone na planszy klocki
  • implementacją ruchu kuli i obsługą jej kolizji z obiektami na planszy

Efekt końcowy

Poniżej znajduje się film prezentujący efekt jaki osiągniemy na zakończenie tego artykułu.

Plansza do gry

Spróbujmy naszkicować planszę naszej gry i zastanówmy się, jak poruszać się będą jej obiekty.


Rys. 1. Plansza. Widok z góry.

Jak widać na Rys. 1, będziemy mieli do czynienia z dwoma typami ruchomych obiektów: rakietką oraz kulą.

Rakietka może przemieszczać się tylko torem wyznaczonym osią X. Poruszanie się rakietki mamy prawie gotowe. Musimy zastanowić się jeszcze nad jej prędkością oraz ograniczeniami wynikającymi z rozmiarów planszy.

Kula może poruszać się w dowolnym kierunku. Dodatkowo musi odpowiednio odbijać się od ścian planszy ( w przyszłości również od klocków ) i od rakietki. Prędkość kuli na tym etapie prac uczynimy stałą.



Tworzenie elementów planszy

Do wyświetlenia planszy będziemy potrzebowali kodu odpowiedzialnego za tworzenie następujących brył:

  • płaszczyzny
  • prostopadłościanu
  • sfery
Funkcje tworzenia siatek płaszczyzny i prostopadłościanu będą bardzo podobne do zaimplementowanej przez nas funkcji o nazwie createCube. Dlatego omówimy jedynie tworzenie siatki sfery. Implementacja pozostałych dwóch funkcji została dołączona do kodu, ale dobrym ćwiczeniem będzie napisanie ich własnoręcznie.

Sfera

Zacznijmy od oczywistej obserwacji: sferę musimy wyświetlić używając wbudowanych w Open GL wielokątów prostych: trójkątów lub czworokątów. Oznacza to, że będziemy musieli przybliżać wygląd sfery, używając wyłącznie tych wielokątów.


Rys. 2. Siatka sfery.

Ponieważ nie istnieje jedna optymalna liczba wielokątów, jaką moglibyśmy użyć do wyświetlenia sfery, skonstruujemy funkcję, która będzie przyjmować liczbę podziałów, czyli dokładność z jaką będziemy chcieli naszą sferę przedstawić.

Rys. 2. przedstawia przykładową siatkę sfery. Wyróżnione kolorem czerwonym wierzchołki siatki tworzą jeden z czworokątów. Tymi czworokątami przybliżymy jej kształt.

Nasza funkcja, dla danej liczby podziałów, powinna zwrócić listę wierzchołków ułożonych w kolejności takiej jak na Rys. 2. Jak zatem iterować przez odpowiednie wierzchołki? Jak je wyznaczać ? Aby zrealizować to zadanie posłużymy się układem współrzędnych sferycznych.


Zgodnie z Rys. 3. każdy punkt należący do sfery o promieniu długości $ r = |\vec{OP}| $, możemy opisać używając dokładnie dwóch parametrów:

  • kąta $ \Phi $, gdzie $ \Phi \in \left[ 0, 2\pi \right] $ tzw. długości geograficznej, która stanowi miarę kąta między rzutem prostokątnym wektora $ \vec{OP} $ na płaszczyznę $ OXZ $ a dodatnią półosią $ OZ $
  • kąta $ \Theta $, gdzie $ \Theta \in \left[ 0, \pi \right] $ tzw. szerokości geograficznej, która stanowi miarę kąta między wektorem $ \vec{OP} $ a dodatnią półosią $ OY $


Rys. 3. Współrzędne sferyczne.

Jak uzyskać wartości współrzędnych w układzie kartezjańskim?

Konwersję z układu sferycznego na współrzędne kartezjańskie $ x,y,z $ punktu $ P $ określają wzory:

$ rh &= |\vec{OP}| * \sin( \Theta ) $

skąd,

$ x &= |\vec{OP}| * \sin( \Theta ) * \sin( \Phi ) $

$ z &= |\vec{OP}| * \sin( \Theta ) * \cos( \Phi ) $

natomiast,

$ y &= |\vec{OP}| * \cos( \Phi ) $


5
Twoja ocena: Brak Ocena: 5 (2 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com