3dMatchGL Wykorzystanie biblioteki graficznej OpenGL przy tworzeniu gry 3DMatchGL
Struktura programu: a) szablon w C++Builder, b) komponent TOpenGLAPPanel, c) silnik ładujący modele *.ASE, d) silnik gry – grafika OpenGL, e) silnik gry – fizyka, f) dźwięk – biblioteka FMOD.
Komponent TOpenGLAPPanel: Typowy komponent typu panel. Nie ma co prawda dokumentacji, ale tutoriale i nazwy właściwości mówią same za siebie w większości przypadków. Jedyne o czym należałoby wspomnieć, to inicjacja, moment zmiany rozmiaru panelu oraz to, co należałoby wykonać przed narysowaniem każdej klatki (co w większości pokrywa się z samym OpenGL, ale wydaje się należeć do standardu).
Inicjacja: Zdarzenie OnInit Typ wypełniania gładki glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.5f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); Ustawienie koloru czyszczenia To samo dla bufora Z Uaktywnienie testu głębi przy rysowaniu Ustawienie funkcji dla testu głębi Ustawienie parametru obliczania perspektywy na najlepszy
Zmiana rozmiaru panelu: Zdarzenie OnResize Zapobieganie dzieleniu przez zero (patrz gluPerspective w OnPaint) if (OpenGLAPPanel1->Height==0) OpenGLAPPanel1->Height=1; glViewport(0,0,OpenGLAPPanel1->Width,OpenGLAPPanel1->Height); Ustawienie okna, w którym ma być rysowane
Rysowanie jednej klatki animacji: Zdarzenie OnPaint Czyszczenie bufora kolorów i głębi glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, (GLfloat)OpenGLAPPanel1->Width / (GLfloat)OpenGLAPPanel1->Height, 0.01f, 1000.0f); gluLookAt(0,-10,10,0,0,0,0,0,1); glMatrixMode(GL_MODELVIEW); ... glFinish(); Tryb macierzy projekcyjnej Ładowanie macierzy jednostkowej Ustaw perspektywę – kąt, aspekt i zakres dystansu rysowania Ustaw pozycję, cel i wektor pionu kamery Tryb macierzy modeli (służy do rysowania) Tutaj odbywa się rysowanie obiektów gry Nakaz czekania przed rysowaniem następnej klatki do zakończenia aktualnej
Relacja OpenGL - Panel: TOpenGLAPPanel stanowi łącznik, między programistą, a biblioteką OpenGL. Wykonuje wszystkie operacje konfiguracji, zmiany buforów itp. za nas. Dba o to, aby w kazdym momencie OpenGL rysował w wyznaczonym dla niego miejscu – w panelu. W tym samym czasie mamy możliwość wydawania poleceń bezpośrednio bibliotece, więc komponent ten w żaden sposób nas nie ogranicza. Przy większej ilości paneli, należy jeszcze przed narysowaniem ustalić, które okienko jest aktywnym. Służy do tego odpowiednia metoda komponentu.
Silnik gry – grafika OpenGL: a) tworzenie obiektu, b) modyfikacja obiektu.
Tworzenie obiektu: Blok glBegin / glEnd Rozpoczęcie bloku definiującego obiekt glBegin( TYP ); ... glEnd(); Rozpoczęcie bloku musi być równoczesne z definicją typu strumieniowanego obiektu. Mogą to być punkty (GL_POINTS), linie (GL_LINES), trójkąty (GL_TRIANGLES) i pochodne tych typów. Strumieniowe definiowanie wierzchołków Zakończenie bloku definiującego obiekt
Tworzenie obiektu: Strumień wierzchołków Dla każdego wierzchołka należy podać jego definicję Określenie koloru wierzchołka (i ewentualnie jego przeźroczystości) [ glColor( parametry ) ] [ glTexCoords( parametry )] glVertex( parametry ) Określenie koordynatów tekstury (jeżeli obiekt jest teksturowany) Określenie położenia wierzchołka w przestrzeni każda z tych funkcji występuje w najróżniejszych odmianach (zmienna liczba parametrów, typów danych itp...).
Tworzenie obiektu: Przykład glBegin( GL_TRIANGLES ); glColor3f( 1,0,0 ); glVertex3f( -1,0,0 ); glColor3f( 0,1,0 ); glVertex3f( 0,1,0 ); glColor3f( 0,0,1 ); glVertex3f( 1,0,0 ); glEnd(); Rysuje trójkąt o rogach w kolorach (r,g,b) kolejno czerwonym, zielonym i niebieskim i wierzchołkach kolejno w (x,y,z): [-1,0,0 ]->[0,1,0]->[1,0,0]
Modyfikacja obiektu: Funkcje Aby tak utworzony obiekt zmodyfikować,czyli obrócić, przesunąć czy przeskalować, należy wszystkie te operacje wykonać w odwrotnej kolejności: ... glBegin(...); glEnd(); Funkcje przekształcające Definicja obiektu
Modyfikacja obiektu: Funkcje Ładowanie macierzy jednostkowej (identyczność przekształcenia) glLoadIdentity(); glTranslate glRotate glScale Funkcja przemieszczenia Funkcja obrotu Funkcja skali
Modyfikacja obiektu: Przykład float Alfa,X,Y,Z; glLoadIdentity(); glTranslatef( X, Y, Z ); glRotatef( Alfa, X, Y, Z ); glScalef( X, Y, Z ); glBegin(...); ... glEnd(); W przykładzie obiekt zdefiniowany w bloku glBegin/glEnd poddany jest najpierw skali o parametrach X, Y i Z, następnie obrócony o kąt Alfa wokół wektora [X, Y, Z] i w końcu przemieszczony o wektor [X,Y,Z].
3dMatchGL Dziękuję za uwagę