alessandro bugatti – itis b. castelli corso di programmazione videogiochi 3 d con c++, opengl e...
TRANSCRIPT
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
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
• 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
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)
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 / W
Y / W
Z / W
X
Y
Z
W
X
Y
Z
X
Y
Z
1
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
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
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
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
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() -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
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 Sfera
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
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
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
Alessandro Bugatti – ITIS B. Castelli
Vettori di illuminazione
Osservatore (V)
Sorgenteluminosa(L)
Normale (N)
Luce riflessa (R)
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
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