470 likes | 870 Views
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…)
E N D
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.
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 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