Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht Alessandro Bugatti – ITIS B. Castelli La programmazione dei videogiochi • Contesto di programmazione molto specializzato e complesso • Ricco di “sfide” informatiche (gestione memoriaprestazioni, 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 Alessandro Bugatti – ITIS B. Castelli 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) Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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,…) Alessandro Bugatti – ITIS B. Castelli Giochi che utilizzano OpenGL • • • • • • • • Call of Duty Doom 3 Flight Gear Half-Life Quake I, II, III e IV Unreal Wolfestein Return to Castle … Alessandro Bugatti – ITIS B. Castelli Applicazioni che utilizzano OpenGL • • • • • Autodesk 3ds Max Blender Cinema 4D LightWave 3D Maya (“Il signore degli Anelli”, “Harry Potter”, …) • Rhino3D, SketchUp, SolidThinking … Alessandro Bugatti – ITIS B. Castelli 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,…) Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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) Alessandro Bugatti – ITIS B. Castelli Cosa utilizzeremo in Linux • Ambiente di sviluppo CodeBlocks 8.02 • gcc (g++) • Mesa (clone OpenGL per Linux) • SDL per tutti gli altri aspetti Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli Differenze grafica 2D-3D • La grafica 3D assomiglia ai cartoni animati moderni realizzati al computer (da Toy Story in poi) Alessandro Bugatti – ITIS B. Castelli 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) Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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 ); Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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); …… ISTRUZIONI …… glEnd(); Alessandro Bugatti – ITIS B. Castelli Disegno in immediate mode • Le istruzioni possono rappresentare i vertici di una figura, espressi con le coordinate x,y,z in un piano cartesiano y tridimensionale (3, 3, 3) x z Alessandro Bugatti – ITIS B. Castelli 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. Alessandro Bugatti – ITIS B. Castelli OpenGL Mode Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli Vettori • Nella geometria tridimensionale i punti si rappresentano utilizzando le coordinate omogenee, che utilizzano vettori a 4 dimensioni perché è “comodo” X X/W X X Y Y/W Y Y Z Z/W Z Z W Alessandro Bugatti – ITIS B. Castelli 1 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 0001 Alessandro Bugatti – ITIS B. Castelli Prodotto matrice per vettore • Il prodotto matrice per vettore è così definito: ux vx wx tx px ux*px + vx*py + wx*pz + tx uy vy wy ty py uy*px + vy*py + wy*pz + ty x = uz vz wz tz pz uz*px + vz*py + wz*pz + tz 0 1 1 0 0 1 Alessandro Bugatti – ITIS B. Castelli Matrice di traslazione 1 0 0 tx 0 1 0 ty 0 0 1 tz 0 0 0 1 Alessandro Bugatti – ITIS B. Castelli Traslazione applicata • Supponendo di voler traslare il punto di 3 unità secondo l’asse delle x: 1 0 0 1 3 1*3 + 0*5 + 0*9 + 1 0 1 0 0 5 0*3 + 1*5 + 0*9 + 0 0 0 1 0 9 0*3 + 0*5 + 1*9 + 0 0 0 1 1 1 0 x = Alessandro Bugatti – ITIS B. Castelli Matrice di scalatura sx 0 0 0 0 sy 0 0 0 0 sz 0 0 0 0 1 Alessandro Bugatti – ITIS B. Castelli Matrici di rotazione cos(a) -sin(a) 0 0 1 0 0 0 sin(a) cos(a) 0 0 0 cos(a) -sin(a) 0 0 0 1 0 0 sin(a) cos(a) 0 0 0 0 1 0 Rotazione intorno all’asse Z 0 0 1 Rotazione intorno all’asse X cos(a) 0 0 0 -sin(a) 0 0 sin(a) 0 cos(a) 0 0 0 1 0 1 Rotazione intorno all’asse Y Alessandro Bugatti – ITIS B. Castelli Utilizzo di quadriche • Una quadrica in 3D è ogni superficie rappresentata da un'equazione polinomiale del secondo ordine nelle variabili spaziali (coordinate). Alessandro Bugatti – ITIS B. Castelli Esempi di quadriche Ellissoide Cilindro Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli 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” Alessandro Bugatti – ITIS B. Castelli Semplice modello di illuminazione Colore K a * ColoreAmbiente K d * ColoreDiff uso * ( N L) K s * ColoreRifl esso * ( R V ) brillantezza 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 Alessandro Bugatti – ITIS B. Castelli Vettori di illuminazione Normale (N) Luce riflessa (R) a a Osservatore (V) Alessandro Bugatti – ITIS B. Castelli Sorgente luminosa(L) 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 Alessandro Bugatti – ITIS B. Castelli 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) Alessandro Bugatti – ITIS B. Castelli 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 Alessandro Bugatti – ITIS B. Castelli