Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht
La programmazione dei videogiochi Contesto di programmazione molto specializzato e complesso Ricco di “sfide” informatiche (gestione memoria-prestazioni, periferiche, rete…) Richiede la conoscenza della fisica e della geometria Elemento trainante dell’evoluzione tecnologica del PC (in particolare della grafica) Settore in forte espansione
Industria dei videogiochi Fatturato italiano 2007 (fonte AESVI): oltre 1 miliardo di euro (+37% rispetto al 2006) 2.374.057 console vendute in Italia nel 2007 (5 al minuto) Fatturato globale stimato nel 2007 di 37 miliardi di dollari (fonte Price Waterhouse)
Perché il C++ Linguaggio maturo e stabile Adatto alla programmazione sia a basso livello che ad alto livello Supporto al paradigma di programmazione orientato agli oggetti Supporto alla programmazione generica Larga disponibilità di compilatori e librerie anche gratuiti
Perché OpenGL Libreria per la grafica 3D (solo grafica) Libreria open, guidata da un comitato (ARB) formato da un insieme di aziende, con specifiche pubbliche Matura (esiste dal 1992, adesso è alla versione 2.1) Multipiattaforma (Windows, Linux/UNIX, MacOSX,…)
Giochi che utilizzano OpenGL Call of Duty Doom 3 Flight Gear Half-Life Quake I, II, III e IV Unreal Wolfestein Return to Castle …
Applicazioni che utilizzano OpenGL Autodesk 3ds Max Blender Cinema 4D LightWave 3D Maya (“Il signore degli Anelli”, “Harry Potter”, …) Rhino3D, SketchUp, SolidThinking …
Cos’è OpenGL Nasce come libreria per la grafica 2D/3D per macchine high-end all’interno dei laboratori di Silicon Graphics È un’API grafica che espone al programmatore una serie di funzioni per la manipolazione di scene 3D Possiede delle estensioni per altri aspetti (gestione delle periferiche, finestre,…)
Cosa serve per creare un’applicazione Un compilatore C/C++ La libreria OpenGL con gli header Una o più librerie per la gestione di ciò che non è pura grafica (window management, input handling, ecc.) Opzionalmente un ambiente di sviluppo Tools per la creazione delle “grafica” se si vuole fare qualcosa di professionale
Cosa utilizzeremo in Windows Ambiente di sviluppo CodeBlocks 8.02 che contiene: compilatore mingw32, porting del noto gcc in ambiente windows Libreria OpenGL (e estensioni) Libreria SDL per maneggiare tutti gli altri aspetti (da installare separatamente)
Cosa utilizzeremo in Linux Ambiente di sviluppo CodeBlocks 8.02 gcc (g++) Mesa (clone OpenGL per Linux) SDL per tutti gli altri aspetti
Differenze grafica 2D-3D La grafica 2D assomiglia ai cartoni animati di una volta (Biancaneve) L’effetto di movimento si ottiene spostando velocemente oggetti precedentemente disegnati Esiste il solo punto di vista frontale
Differenze grafica 2D-3D La grafica 3D assomiglia ai cartoni animati moderni realizzati al computer (da Toy Story in poi)
Aspetti tipici della grafica 3D Vengono creati dei modelli tridimensionali Esistono infiniti punti di vista, basta spostare la “telecamera” L’ambiente e tutto ciò che contiene devono comunque essere proiettati su una superficie bidimensionale Effetti come sfumature, ombre, luci, trasparenze ecc. vengono realizzati a costo zero (per il programmatore)
Pipeline grafica La geometria e le texture passano attraverso queste fasi Determinazione della visibilità Clippling Culling Occlusion testing Determinazione della risoluzione (LOD) Trasformazioni geometriche e illuminazione Rasterizzazione
Come funziona OpenGL Per il programmatore OpenGL è un’API grafica che lo astrae dall’hardware sottostante, permettendo di dichiarare degli oggetti geometrici e le operazioni che devono essere effettuate su di essi. E’ come una macchina a stati e ogni istruzione va a modificarne lo stato interno
OpenGL + SDL SDL (Simple DirectMedia Layer) è una libreria per l’accesso all’hardware che utilizzeremo insieme a OpenGL per gestire tutti gli aspetti non legati alla grafica Questo ci permetterà di creare programmi che gireranno su tutte le piattaforme che supportano SDL e OpenGL semplicemente ricompilandoli
Struttura di un programma Inizializzazione SDL Inizializza la libreria SDL_Init( SDL_INIT_VIDEO ) Abilita il double buffering SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); Setta la modalità video SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, videoFlags );
Struttura di un programma Inizializzazione OpenGL Vengono impostati una serie di parametri secondo ciò che si desidera ottenere Esempi: Settare il colore di sfondo Impostare i vari buffer Abilitare alcuni test Scegliere la prospettiva
Struttura di un programma Main loop: è un ciclo che termina generalmente quando si chiude il programma e al cui interno: si processano gli eventi (input dell’utente, comunicazioni di rete, …) si eseguono altri task (AI, simulazione del modello fisico,…) si disegna a video
Disegno in immediate mode Vengono date una serie di istruzioni fra un blocco di inizio e uno di fine, che vengono eseguite immediatamente glBegin(MODE); …… glEnd(); ISTRUZIONI
Disegno in immediate mode Le istruzioni possono rappresentare i vertici di una figura, espressi con le coordinate x,y,z in un piano cartesiano tridimensionale y (3, 3, 3) x z
Disegno in immediate mode A seconda del mode prescelto vengono interpretate le istruzioni in modo diverso Esistono 10 mode: GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, GL_POLYGON.
OpenGL Mode
Colorare una figura I colori possono essere rappresentati in formato RGB o RGBA L’istruzione glColor (in tutte le sue versioni) modifica il colore di tutte le primitive disegnate da quell’istruzione in poi A seconda dello shade model viene applicata un’interpolazione fra i colori
Trasformazioni in 3D Esistono tre trasformazioni che possono essere applicate ad una figura nello spazio tridimensionale Traslazione: spostamento secondo una o più direzioni parallele agli assi coordinati Rotazione: rotazione di un certo angolo attorno ad un vettore di riferimento Scalatura: modifica delle dimensioni rispetto ai tre assi coordinati
Applicazione di trasformazioni Siccome un punto nello spazio tridimensionale è individuato dalle sue 3 coordinate e una figura è composta da un insieme di punti, applicare una trasformazione ad una figura è equivalente ad applicarla a tutti i punti che la compongono. Un punto viene rappresentato da un vettore
Vettori Nella geometria tridimensionale i punti si rappresentano utilizzando le coordinate omogenee, che utilizzano vettori a 4 dimensioni perché è “comodo” X Y Z W X Y Z 1 X / W Y / W Z / W X Y Z
Matrici di trasformazione Per trasformare un punto applicando una delle operazioni viste in precedenza è sufficiente moltiplicarlo per una matrice opportunamente definita Queste matrici sono 4x4 e sono fatte in modo da avere nell’ultima riga i valori 0 0 0 1
Prodotto matrice per vettore Il prodotto matrice per vettore è così definito: ux vx wx tx uy vy wy ty uz vz wz tz 0 0 0 1 px py pz 1 ux*px + vx*py + wx*pz + tx uy*px + vy*py + wy*pz + ty uz*px + vz*py + wz*pz + tz 1 x =
Matrice di traslazione 1 0 0 tx 0 1 0 ty 0 0 1 tz 0 0 0 1
Traslazione applicata Supponendo di voler traslare il punto di 3 unità secondo l’asse delle x: 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 3 5 9 1 1*3 + 0*5 + 0*9 + 1 0*3 + 1*5 + 0*9 + 0 0*3 + 0*5 + 1*9 + 0 1 x =
Matrice di scalatura sx 0 0 0 0 sy 0 0 0 0 sz 0 0 0 0 1
Matrici di rotazione cos(a) -sin(a) 0 0 sin(a) cos(a) 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 cos(a) -sin(a) 0 0 sin(a) cos(a) 0 0 0 0 1 cos(a) 0 -sin(a) 0 0 0 0 1 sin(a) 0 cos(a) 0 0 0 0 1 Rotazione intorno all’asse Z Rotazione intorno all’asse X Rotazione intorno all’asse Y
Utilizzo di quadriche Una quadrica in 3D è ogni superficie rappresentata da un'equazione polinomiale del secondo ordine nelle variabili spaziali (coordinate).
Esempi di quadriche Ellissoide Cilindro Sfera
Libreria GLU La libreria GLU (GL Utility) racchiude una serie di funzioni “comode” Prima si crea una quadrica GLUquadricObj* gluNewQuadric( ) che crea memoria per i parametri della superficie e ritorna un puntatore Poi si sceglie il tipo
Esempio delle sfera void gluSphere(GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks) dove: radius è il raggio della sfera slices sono le fette in direzione longitudinale stacks sono le fette in direzione latitudinale
Illuminazione Serve a dare realismo agli ambienti e aumenta il senso di tridimensionalità Il nostro cervello per avere la senzazione di tridimensionalità sfrutta le informazioni prospettiche, ma non basta L’illuminazione consente agli oggetti di proiettare dei riflessi che ci permettono di intuirne il volume
Differenti tipi di luce Luce ambiente: luce che “riempie” l’ambiente e provvede l’illuminazione di base Luce diffusa: luce riflessa dalle varie superfici in tutte le direzioni Luce riflessa: luce riflessa dalle superfici secondo la “direzione dello specchio”
Semplice modello di illuminazione dove: Ka,Ks e Kd sono i pesi che vengono dati alle varie componenti (in generale la loro somma è uno) e Colore Ambiente, ColoreDiffuso e ColoreRiflesso sono i colori che vengono associati ai vari tipi di luce
Vettori di illuminazione Normale (N) Sorgente luminosa(L) Luce riflessa (R) a a Osservatore (V)
Illuminazione in OpenGL OpenGL si occupa di implementare la formula corretta, noi dobbiamo semplicemente inserire i parametri dell’illuminazione e dei materiali che compongono i nostri oggetti Dobbiamo inoltre specificare la normale alle superfici per ottenere l’effetto desiderato
Funzioni per l’illuminazione glEnable(GL_LIGHTING) Abilita il calcolo delle luci. Senza questa chiamata non funziona niente. glEnable (GL_LIGHTn) Abilita la luce n-esima, dove n va almeno da 0 a 9 (cioè si possono piazzare dieci luci diverse in una scena)
Funzioni per l’illuminazione glLightfv(GLenum luce, GLenum tipo_di_luce, GLfloat* parametri_luce) dove luce è il numero di luce che stiamo settando (GL_LIGHTn), tipo_di_luce definisce se è ambiente, diffusa o riflessa o di altri tipi e parametri_luce definiscono il colore della luce come vettore RGBA