|
|
|
Paolo Cignoni |
|
cignoni@iei.pi.cnr.it |
|
http://vcg.iei.pi.cnr.it/~cignoni |
|
|
|
5 dicembre 2001 |
|
|
|
|
|
Esercizi proposti |
|
Esplosioni con frammenti |
|
Stars |
|
Better intro |
|
|
|
|
Perspective View and flying asteroids |
|
|
|
|
|
Usando font3d occorre fare attenzione a |
|
NON CREARE TROPPI TRIANGOLI |
|
max 2000 |
|
Se ne genera troppi modificare i vari parametri
di font3d per ottimizzare la creazione della scritta (no bevel e minore
resolution) |
|
|
|
|
|
Nella GameIntro::Reshape() |
|
gluPerspective(fov,a,near,far); |
|
dove |
|
fov è l’apertura dell’angolo di vista nel nostro
esempio 90 gradi (un grandangolo) |
|
a è l’aspect ratio della camera |
|
near e far indicano la distanza dei due piani
perpendicolari al viewer entro cui è racchiusa la scena. |
|
gluLookAt(xv,yv,zv, xt,yt,zt, upx,upy,upz); |
|
dove |
|
xv,yv,zv posizione dell’osservatore (0,0,200) |
|
xt,yt,zt, posizione del punto dove si guarda
(0,0,0) |
|
upx,upy,upz direzione dell’alto (0,1,0) |
|
|
|
|
|
|
|
|
View Frustum Clipping |
|
inutile disegnare quel che non si vede |
|
In molti casi è facile capire che cosa è fuori
dal view frustum |
|
nel nostro caso quando un asteroide |
|
200-z < abs(x) |
|
|
|
|
|
|
Texture Mapping |
|
Sound (preliminary) |
|
|
|
|
GameSession figlia di GameSection |
|
Nuova classe intro |
|
Tutte le GlutCallback si rifanno alla variable
globale che GameSection corrente |
|
Passare dall’intro al gioco significa cambiare
la GameSection corrente |
|
variabili globali per tenere una gamesession e
una gameintro |
|
|
|
|
Colorare una primitiva (triangolo) secondo i
colori di una bitmap |
|
Aggiungere dettagli senza aumentare la
complessità della geometria dei modelli |
|
|
|
|
Per specificare come si colora un triangolo si
definiscono le coordinate di texture che indicano dove ritagliare la bitmap
per colorare il triangolo |
|
|
|
|
|
|
Per ogni vertice si specifica quindi |
|
|
|
Le sue coordinate 3d effettive: |
|
glVertex3f(x,y,z) |
|
e le corrispondenti coordinate di texure |
|
glTexCoord2f(s,t) |
|
|
|
|
|
|
|
|
|
|
|
|
Ad ogni vertice del triangolo è assegnato un
punto sulla texture |
|
|
|
|
|
|
|
|
|
|
|
|
Modificando le coordinate di texture cambia che
cosa viene disegnato sul triangolo |
|
|
|
|
|
|
|
|
|
|
|
|
Modificando la matrice di trasformazione la
texture rimane ferma sull’oggetto |
|
|
|
|
|
Caricare le texture |
|
creare un nome |
|
scegliere il nome di texture |
|
caricare un immagine |
|
Scegliere una texture corrente |
|
specificare per ogni vertice le coordinate di
texture |
|
|
|
|
|
Ogni texture ha un nome con cui puo’ essere
richiamata velocemente |
|
glGenTextures(n,int *names) |
|
crea n nomi di texture memorizzandoli in names[] |
|
Per scegliere una texture |
|
glBind(GL_TEXTURE2D, texturename) |
|
|
|
|
glTexParameter permette di settare |
|
|
|
GL_TEXTURE_MIN_FILTER |
|
GL_TEXTURE_MAG_FILTER |
|
GL_TEXTURE_WRAP_S |
|
GL_TEXTURE_WRAP_T |
|
|
|
|
|
|
|
|
|
|
void glTexImage2D(GL_TEXTURE_2D |
|
GLint level, // the mipmap level |
|
GLint components, // number of color component
(1..4) |
|
GLsizei width, // must be 2^n |
|
GLsizei height, // must be 2^n |
|
GLint border, // width of border |
|
GLenum format, // GL_RGB, GL_RGBA, GL_ALPHA ecc |
|
GLenum type, // the data type of pixel
(GL_BYTE, ecc) |
|
const GLvoid *pixels // a pointer to the image. |
|
); |
|
|
|
|
|
|
|
Il problema maggiore è come caricare
un’immagine: |
|
Generarsi la texture da soli (facile per
scacchiere e affini) |
|
Scriversi un lettore per un formato di immagini
molto semplice (.pbm) |
|
Utilizzare una lib tipo glpng. |
|
|
|
|
|
|
Libreria free che permette di caricare come
texture un’immagine in formato png |
|
|
|
#include <gl/glpng.h> |
|
… |
|
pngInfo info; |
|
GLuint texture; |
|
glGenTextures(1, &texture); |
|
glBindTexture(GL_TEXTURE_2D, texture); |
|
pngLoad(filename, PNG_NOMIPMAP, PNG_SOLID,
&info)) |
|
|
|
|
|
Scegliere una texture con |
|
glBind() |
|
specificare come si vuole utilizzare il colore
della texture con |
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_MODULATE); |
|
GL_MODULATE moltiplica il colore della
texture per il colore dell’oggetto dopo lo shading (in questo modo la
texture viene ombreggiata) |
|
GL_DECAL il colore viene applicato esattamente. |
|
disegnare specificando le coordinate di texture |
|
|
|
|
Partire da un rendering
ortografico dell’astronave |
|
|
|
|
|
|
|
Colorarlo a piacimento
con un qualunque bitmap
editor (paintshoppro, gimp) |
|
|
|
|
Per specificare le coordinate di texture basta
ricordarsi che la geometria dell’astronave era (dopo una Mesh::Normalize())
all’interno di un box unitario centrato sull origine. |
|
|
|
glTexCoord2f(-x+.5,y+.5); |
|
glVertex3f(x,y,z); |
|
|
|
|
Textured Asteroids |
|
Aggiungere una texture significativa agli
asteroidi per rendere meno uniforme la superficie |
|