alessandro bugatti – itis b. castelli corso di programmazione videogiochi 3 d con c++, opengl e...

45
Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C+ +, OpenGL e Irrlicht

Upload: alessandra-sassi

Post on 02-May-2015

227 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

Corso di programmazione videogiochi 3 D con C++,

OpenGL e Irrlicht

Page 2: Alessandro Bugatti – ITIS B. Castelli 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 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

Page 3: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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)

Page 4: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 5: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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,…)

Page 6: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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• …

Page 7: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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 …

Page 8: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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,…)

Page 9: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 10: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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)

Page 11: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 12: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 13: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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)

Page 14: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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)

Page 15: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 16: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 17: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 18: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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 );

Page 19: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 20: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 21: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

• Vengono date una serie di istruzioni fra un blocco di inizio e uno di fine, che vengono eseguite immediatamente

glBegin(MODE);…………

glEnd();

Disegno in immediate mode

ISTRUZIONI

Page 22: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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 tridimensionale

x

y

z

(3, 3, 3)

Page 23: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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.

Page 24: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

OpenGL Mode

Page 25: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 26: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 27: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 28: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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 / W

Y / W

Z / W

X

Y

Z

W

X

Y

Z

X

Y

Z

1

Page 29: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

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

Page 30: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

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

x =

ux*px + vx*py + wx*pz + tx

uy*px + vy*py + wy*pz + ty

uz*px + vz*py + wz*pz + tz

1

Page 31: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

Matrice di traslazione

1 0 0 tx

0 1 0 ty

0 0 1 tz

0 0 0 1

Page 32: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

0 1 0 0

0 0 1 0

0 0 0 1

3

5

9

1

x =

1*3 + 0*5 + 0*9 + 1

0*3 + 1*5 + 0*9 + 0

0*3 + 0*5 + 1*9 + 0

1

Page 33: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

Matrice di scalatura

sx 0 0 0

0 sy 0 0

0 0 sz 0

0 0 0 1

Page 34: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

Matrici di rotazione

cos() -sin() 0 0

sin() cos() 0 0

0 0 1 0

0 0 0 1

1 0 0 0

0 cos() -sin() 0

0 sin() cos() 0

0 0 0 1

cos() 0 -sin() 0

0 0 0 1

sin() 0 cos() 0

0 0 0 1

Rotazione intornoall’asse Z

Rotazione intornoall’asse X

Rotazione intornoall’asse Y

Page 35: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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).

Page 36: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

Esempi di quadriche

Ellissoide Cilindro Sfera

Page 37: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

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

Page 38: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 39: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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

Page 40: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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”

Page 41: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

Semplice modello di illuminazione

zabrillantezs

d

a

VRessoColoreRiflK

LNusoColoreDiffK

enteColoreAmbiKColore

)(**

)(**

*

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

Page 42: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

Vettori di illuminazione

Osservatore (V)

Sorgenteluminosa(L)

Normale (N)

Luce riflessa (R)

Page 43: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

Alessandro Bugatti – ITIS B. Castelli

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

Page 44: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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)

Page 45: Alessandro Bugatti – ITIS B. Castelli Corso di programmazione videogiochi 3 D con C++, OpenGL e Irrlicht

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