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.ASE.3DS.OBJ.X.Max.lwo.dxf Centinaia di formati ….. vrml.mdl.m3g.blend.osg.dts.stl.md2.m
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 Struttura Dati struct t3DObject { int numOfVer; int numOfFace; CVector3 *pVerts; tFace *pFaces; }; *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 } INIT: RENDER:
Struttura di un file ASE - 1 Identificatori principali: *SCENE{ … } Informazioni sulla scena, sulle animazioni, sulle luci dambiente e i colori di background *MATERIAL_LIST { … } Elenco di tutti i materiali utilizzati dagli oggetti nella scena *GEOMOBJECT { … } 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 …… *MESH_VERTEX } *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 dei vertici Elenco delle facce
Rendering - 1 struct t3DModel { int numOfObjects; vector pObject; }; struct t3DObject { int numOfVerts; int numOfFaces; CVector3 *pVerts; tFace *pFaces; }; struct tFace{ int vertIndex[3]; }; struct CVector3 { float x, y, z; }; Rappresenta un Modello (file) Un oggetto del modello Una faccia Un vertice
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 numOfFaces; j++){ for(int k = 0; k <3; k++){ int vertIndex = pObject-pFaces[j].vertIndex[k] glVertex3f(pObject->pVerts[ vertIndex ].x, pObject->pVerts[ vertIndex ].y, pObject->pVerts[ vertIndex ].z); } glEnd(); }
Ulteriori Dati Possibilità di inserire: Informazioni su materiali (texture) Dati aggiuntivi (normali per illuminazione)
Formati Binari - 1 Difficili da leggere, ma più performanti Lobbiettivo è 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 delloggetto con la sua rappresentazione vera e propria utilizzando un file testuale o binario per mantenere le informazioni.
Bibliografia - 1 Riferimenti: ASE_File_Format e.htm
Bibliografia - 2 Software: Blender: Lib3Ds: lib3ds.sourceforge.net LibAse: