Utilizzo di modelli 3D nella
programmazione OpenGL
Corso di Elementi di Grafica Digitale
Anno accademico 2004/2005
Daniele Otti
Università degli Studi di Trieste
Introduzione
Necessità:


Utilizzo di modelli precedentemente
acquisiti
Utilizzo di software appositi per la
creazione di figure complesse
Formati di esportazione
Centinaia di formati …..
.m
.Max
.3DS
.OBJ
.X
.dxf
.md2
.ASE
.stl
.lwo
vrml
.blend
.osg
.mdl
.m3g
.dts
Perchè ASE?
Pro:
 Formato testuale
 Facile da leggere e implementare
Contro:
 File di grosse dimensioni - Basse
prestazioni
 Non può essere importato
 Non ottimizzato (Grafi di Scena…)
Funzionamento di un Parser
Modello 3D
INIT:
RENDER:
*GEOMOBJECT {
*MESH {
*MESH_NUMVERTEX 8
*MESH_NUMFACES 12
*MESH_VERTEX_LIST {
*MESH_VERTEX 0
*MESH_VERTEX 7
}
*MESH_FACE_LIST {
*MESH_FACE 0
*MESH_FACE 11
}
Struttura
Dati
struct t3DObject {
int numOfVer;
int numOfFace;
CVector3 *pVerts;
tFace *pFaces;
};
Struttura di un file ASE - 1
Identificatori principali:

*SCENE{ … }


*MATERIAL_LIST { … }


Elenco di tutti i materiali utilizzati dagli oggetti nella
scena
*GEOMOBJECT { … }


Informazioni sulla scena, sulle animazioni, sulle luci
d’ambiente e i colori di background
Elenco degli oggetti contenuti nella scena
*LIGHTOBJECT { … }

Informazioni sulle luci della scena
Struttura di un file ASE - 2
*GEOMOBJECT {
*MESH {
*MESH_NUMVERTEX 8
*MESH_NUMFACES 12
*MESH_VERTEX_LIST {
*MESH_VERTEX 0
……
*MESH_VERTEX 7
}
}
}
Elenco dei vertici
-50.0000 -50.0000 0.0000
50.0000 50.0000 100.0000
*MESH_FACE_LIST {
*MESH_FACE 0: A: 0 B: 2 C: 3 AB: 1 BC: 1 CA: 0
….
*MESH_FACE 11: A: 4 B: 6 C: 2 AB: 1 BC: 1 CA: 0
}
Elenco delle facce
Rendering - 1
struct t3DModel {
int numOfObjects;
vector<t3DObject> pObject;
};
struct t3DObject {
int numOfVerts;
int numOfFaces;
CVector3 *pVerts;
tFace *pFaces;
};
Rappresenta un
Modello (file)
Un oggetto del
modello
struct CVector3 {
float x, y, z;
};
Un vertice
struct tFace{
int vertIndex[3];
};
Una faccia
Rendering - 2
for(int i = 0; i < g_3DModel.numOfObjects; i++){
t3DObject *pObject = &g_3DModel.pObject[i];
glBegin(GL_LINE_STRIP);
for(int j = 0; j < pObject->numOfFaces; j++){
for(int k = 0; k <3; k++){
}
}
}
glEnd();
int vertIndex = pObject-pFaces[j].vertIndex[k]
glVertex3f(pObject->pVerts[ vertIndex ].x,
pObject->pVerts[ vertIndex ].y,
pObject->pVerts[ vertIndex ].z);
Ulteriori Dati
Possibilità di inserire:


Informazioni su materiali (texture)
Dati aggiuntivi (normali per
illuminazione)
Formati Binari - 1


Difficili da leggere, ma più
performanti
L’obbiettivo è comunque quello di
creare in memoria una struttura
dati che è come quella che abbiamo
appena visto
Formati Binari - 2
Formato 3DS:
 Informazioni analoghe ad ASE
 Organizzate in chunks:
ID
Lunghezza del chunk
Attributi
Se non si è interessato ad un campo, lo
si salta
Conclusioni
Un modello quindi:
Separa la fase di realizzazione
dell’oggetto con la sua
rappresentazione vera e propria
utilizzando un file testuale o binario
per mantenere le informazioni.
Bibliografia - 1
Riferimenti:



http://wiki.beyondunreal.com/wiki/
ASE_File_Format
http://www.solosnake.com/main/as
e.htm
http://www.spacesimulator.net
Bibliografia - 2
Software:

Blender: www.blender.org

Lib3Ds: lib3ds.sourceforge.net

LibAse:
http://interreality.org/projects/libase
Scarica

Ricerca - UniNa STiDuE