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
Scarica

Videogiochi - Lezione 1