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