Modelli: formati, strutture dati, processing della mesh Davide Gadia Corso di Programmazione Grafica per il Tempo Reale Laurea Magistrale in Informatica per la Comunicazione a.a. 2013/2014 Outline Modelli high-poly vs low-poly Formati di interscambio e web-oriented Cenni elaborazione dati in pipeline Cenni strutture dati
Pipeline di rendering: Application stage Task più importante: Invio delle primitive di rendering a hardware grafico Triangoli Operazioni preliminari all'invio al Geometry stage: caricamento/creazione informazioni geometria tessellation consolidation simplification Modelli 3D Possibili sorgenti: tecniche di modellazione poligonale tecniche di modellazione basata su superfici tecniche di modellazione procedurale scannerizzazione 3D ricostruzione da foto... combinazione di queste tecniche
Modelli 3D high-poly vs low-poly Differenza tra modelli per animazione e per real-time Animazione alto livello di dettaglio per curvature alto numero poligoni quadrilateri spesso si utilizzano superfici parametriche Real-time compromesso su complessità mesh per prestazioni basso numero di poligoni triangoli quasi esclusivamente modelli poligonali Modelli 3D high-poly vs low-poly
Modelli 3D high-poly vs low-poly Modelli 3D high-poly vs low-poly
Modello poligonale Poligoni Triangoli o quadrati Componenti base: Vertici Spigoli Facce Altri possibili attributi: Normali Per faccia o per vertice Coordinate UV Colore o materiale. Formati di interscambio Esistono diversi (TANTI) formati per salvataggio dati mesh poligonale ASCII o binari Proprietari o open Problema: Esportazione e riutilizzo formati in SW/ambienti diversi Supporto nativo o utilizzo diverse librerie esterne Formati di interscambio Proposte di standard open per scambio modelli tra diverse applicazioni
Formati di interscambio : Wavefront OBJ (.obj) Proposto da Wavefront Technologies Formato ASCII semplice e aperto Solo geometria Face based Elenco: Vertici Coordinate UV Normali Di tutto l'oggetto Mantiene organizzazione gerarchica Proprietari o open Facce da indici nell'elenco delle singole componenti. Informazioni su materiali\texture su file.mtl esterno Molto utilizzato e supportato Formati di interscambio : Wavefront OBJ File di definizione materiali Lista vertici Lista coordinate texture Lista normali Lista facce mtllib cubo.mtl g default v -0.500000 0.000000 0.500000 v 0.500000 0.000000 0.500000 v -0.500000 1.000000 0.500000 v 0.500000 1.000000 0.500000 v -0.500000 1.000000-0.500000 v 0.500000 1.000000-0.500000 v -0.500000 0.000000-0.500000 v 0.500000 0.000000-0.500000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 0.000000 1.000000 #altre coord texture... vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 1.000000 0.000000 #altre normali... g pcube1 f 1/1/1 2/2/2 4/4/3 3/3/4 f 3/3/5 4/4/6 6/6/7 5/5/8 f 5/5/9 6/6/10 8/8/11 7/7/12 f 7/7/13 8/8/14 2/10/15 1/9/16 f 2/2/17 8/11/18 6/12/19 4/4/20 f 7/13/21 1/1/22 3/3/23 5/14/24
Formati di interscambio : COLLADA (.dae) Proposto e gestito da Khronos Group COLLAborative Design Activity.dae = Digital Asset Exchange Schema XML open Geometria Shader e materiali Animazioni Simulazioni fisiche Versioni multiple dello stesso asset Grande flessibilità Difficoltà nell'implementare API e tool che seguano correttamente standard Problemi di compatibilità tra importer/exporter Formati di interscambio : COLLADA <COLLADA xmlns="http://www.collada.org/2005/11/colladaschema" version="1.4.1">... <library_geometries> <geometry id="box-lib" name="box"> <mesh> <source id="box-lib-positions" name="position"> <float_array id="box-lib-positions-array" count="24">-50 50 50 50 50 50-50 -50 50 50-50 50-50 50-50 50 50-50 -50-50 -50 50-50 -50</float_array> <technique_common> <accessor count="8" offset="0" source="#box-lib-positions-array" stride="3"> <param name="x" type="float"></param> <param name="y" type="float"></param> <param name="z" type="float"></param> </accessor> </technique_common> </source> <source id="box-lib-normals" name="normal"> <float_array id="box-lib-normals-array" count="72">0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0-1 0 0-1 0 0-1 0 0-1 0-1 0 0-1 0 0-1 0 0-1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0-1 0 0-1 0 0-1 0 0-1</float_array> <technique_common> <accessor count="24" offset="0" source="#box-lib-normals-array" stride="3"> <param name="x" type="float"></param> <param name="y" type="float"></param> <param name="z" type="float"></param> </accessor> </technique_common> </source> <vertices id="box-lib-vertices"> <input semantic="position" source="#box-lib-positions"/> </vertices> <polylist count="6" material="bluesg"> <input offset="0" semantic="vertex" source="#box-lib-vertices"/> <input offset="1" semantic="normal" source="#box-lib-normals"/> <vcount>4 4 4 4 4 4</vcount> <p>0 0 2 1 3 2 1 3 0 4 1 5 5 6 4 7 6 8 7 9 3 10 2 11 0 12 4 13 6 14 2 15 3 16 7 17 5 18 1 19 5 20 7 21 6 22 4 23</p> </polylist> </mesh> </geometry> </library_geometries>... </COLLADA>
Formati web per la grafica : VRML (.wrl) Virtual Reality Modeling Language Proposto e gestito da Web3D Consortium Standard ISO nel 1997 Linguaggio di markup visualizzazione e interazione con scenario di grafica All'interno del browser Necessità di plugin La limitata disponibilità di banda ne limitò il successo Formati web per la grafica : VRML #VRML V2.0 utf8 Separator { } Texture2 {filename "bark.jpg"} Cylinder { parts ALL radius 0.5 height 4 }
Formati web per la grafica : X3D (.x3d) extensible 3D sviluppato da Web3D Consortium Successore di VRML Standard ISO nel 2004 Basato su XML Supporta animazioni, multitexturing, shader, ottimizzazioni, ecc Gestisce anche audio, interazione, networking Migliore supporto tramite API Profili: Core, Interchange, Interactive, Immersive, Full Espongono numero crescente di funzionalità Scenario utilizza il profilo + adatto al suo scopo Prima di HTML5, necessità di plugin Adesso integrazione con altri dialetti XML per rendering su Canvas Interfacciamento con WebGL e Javascript Formati web per la grafica : X3D <X3D version='3.0 profile='interchange'> <head> </head> <Scene> <Group> <NavigationInfo type='"examine"'/> <DirectionalLight/> <Transform translation='3.0 0.0 1.0'> <Shape> <Sphere radius='2.3'/> <Appearance> <Material diffusecolor='1.0 0.0 0.0'/> </Appearance> </Shape> </Transform> </Group> </Scene> </X3D>
Formati web per la grafica : basati su JSON JavaScript Object Notation Formato di interscambio di dati Generici, non solo per grafica Basato su sottoinsieme di Javascript ASCII, molto semplice Basato su array di coppie nome:valore Con introduzione WebGL Diffusione di descrizione JSON della scena e dei modelli Va bene per scene non troppo complesse O se la scena è composta da numerosi elementi separati Es: Visualizzazione scientifica Sfruttando caricamento asincrono con AJAX Creazione plugin/script appositi per SW modellazione Formati web per la grafica : basati su JSON { "objectname" : ["Plane"], "texturepath" : ["(null)"], "vertexpositions" : [1.000000,0.000000,- 1.000000,1.000000,0.000000,1.000000,- 1.000000,0.000000,1.000000,-1.000000,0.000000,- 1.000000], "vertextexturecoords" : [], "indices" : [0,3,2,1], "texindices" : [] }
Preparazione/Ottimizzazione mesh Prima dell'invio delle primitive alla GPU Operazioni: tessellation consolidation simplification Trattazione introduttiva e non approfondita Tecniche più legate a sviluppo motore di rendering/engine grafico Vedere cap 12 Realtime rendering per dettagli Tessellation La geometria caricata dal modello presenta poligoni con 4 spigoli E' necessario suddividere i poligoni Criteri: Triangoli: hardware è ottimizzato per triangoli Tessellation diventa triangolazione Caso + comune Convessità: tutti i sottopoligoni devono essere convessi Area: divido in sottopoligoni con area massima prestabilita Regolarità: divido in sottopoligoni usando uno schema uniforme
Tessellation Processo complicato Numerosi possibili problemi Geometria del modello presenta problemi Poligoni non planari Incroci pericolosi di edge Necessità di controlli e più passi di aggiustamento Triangoli troppo lunghi e stretti creano problemi in shading Vertici a T vanno eliminati aggiungendo triangoli.. Consolidation Fase di ottimizzazione della geometria Merging Orientation Generazione normali ai vertici
Merging Polygon soup: Modelli possono presentare poligoni disconnessi 2 poligoni condividono spigoli e vertici, ma in memoria sono separati Ripetizione di informazione Spreco di risorse Dati vengono convertiti in una Polygon Mesh: Analisi e introduzione nella mesh dei vertici, eliminando i doppioni Unione di vertici molto vicini, e inserimento nuovo vertice nella mesh welding Orientation Caratteristica di una buona mesh: Uniformità di orientamento dei poligoni Ordine dei vertici uniforme nella mesh (es: senso antiorario) Comporta normali di faccia orientate alla stessa maniera Uniformare orientamento richiede: analizzare la mesh creata in fase di merging Ordine vertici Relazioni tra spigoli in comune Creazione grafo di vicinanza tra poligoni Trovare poligoni con senso diverso dai vicini e ribaltarli Procedimento funziona se ogni spigolo è in comune solo a massimo 2 poligoni
Orientation Normal smoothing Generazione normali ai vertici Essenziali per rendering Spesso non fornite dal modello esportato da SW modellazione
Normal smoothing Calcolo a partire da normali faccia Calcolo normali vertice mediando le normali delle facce comuni Contributo dato da angolo tra faccia e normale nel calcolo della media serve a evitare inconsistenza Simplification Data reduction Decimation Analisi della mesh dopo fasi precedenti Tentativo di rimuovere poligoni inutili o non significativi Mantenendo l'apparenza finale Di solito, tramite generazione di normal map a partire dalla mesh originale, applicate poi alla mesh decimata Per applicazioni in tempo reale Prestazioni migliori diminuendo il numero di primitive mandate avanti nella pipeline
Simplification Edge collapse o Edge contraction Statico Dinamico View-dependent Terrain rendering Comporta eliminazione di elementi e primitive Possibilità di introdurre artefatti Necessità di ulteriori passi di pulizia della mesh Simplification
Subdivision surfaces Generazione di mesh dettagliate a partire da mesh semplice (mesh di controllo) Subdivision surfaces Processo a 2 fasi: Fase di raffinamento Creo nuovi vertici e collegamenti tra i nuovi triangoli Fase di smoothing Aggiusto la posizione 3D dei nuovi vertici seguendo la curvatura della mesh
Subdivision surfaces Diversi approcci proposti in letteratura: Statici vs dinamici Triangle-based vs polygonal-based Loop subdivision 3 subdivision Doo-Sabin subdivision Catmull-Clark subdivision Tecnica + famosa Sviluppata da Pixar In libreria open-source https://github.com/pixaranimationstudios/opensubdiv Subdivision surfaces Di solito applicate per animazione Utilizzate anche in modellazione modelli per videogiochi Creazione diverse versioni dei modelli Level of detail Con WebGL, diventa utile per avere il caricamento di una mesh molto semplificata Rifinita da un passo di suddivisione calcolato lato client
Polygon mesh: strutture dati Necessità di strutture dati adeguate Per ottimizzare processo merging e orientation E elaborazioni successive Polygon mesh: strutture dati Soluzione facile e intuitiva: Lista di vertici Lista di indici nella lista dei vertici per descrivere i poligoni v1 v2 0 1 2 3 4 v1 v2 v3 v4 v5 Lista vertici v5 f1 v4 f2 v3 f1 0 1 3 4 f2 1 2 3 Poligoni
Polygon mesh: strutture dati Problema: mancano informazioni sugli spigoli Si possono ricavare Computazionalmente pesante per modelli complessi Aggiungo ridondanza: Lista di vertici Lista di indici nella lista dei vertici per descrivere gli spigoli Lista di indici nella lista dei vertici per descrivere i poligoni Devo comunque fare una ricerca in tutte le liste Strutture dati Semplici liste non efficienti Serve struttura dati flessibili, ottimizzate e veloci Con accesso diretto e in tempo costante agli elementi vicini a una primitiva considerata Senza dover analizzare tutta la struttura dati
Struttura dati Half-edge Implementazione: Spezza uno spigolo in due per la sua lunghezza Entità separate orientate in senso opposto Nella struttura dati puntatori a: Vertice alla fine del semi-spigolo Semi-spigolo successivo Faccia interna allo semi-spigolo Semi-spigolo gemello orientato in senso opposto Struttura dati Half-edge
Half-edge: implementazione C struct HE_vert { float x; float y; float z; struct HE_edge { //vertice alla fine del half-edge HE_vert* vert; }; //half-edge uscente dal vertice HE_edge* edge; struct HE_face { //un half-edge di contorno HE_edge* edge; }; }; //half-edge gemello HE_edge* pair; //faccia interna al half-edge HE_face* face; //half-edge successivo HE_edge* next; Half-edge: implementazione C //trovare i vertici e le facce adiacenti a un edge HE_vert* vert1 = edge->vert; HE_vert* vert2 = edge->pair->vert; HE_face* face1 = edge->face; HE_face* face2 = edge->pair->face; inc. vertex face opposite //trovare ed elaborare tutti gli edge di una faccia HE_edge* edge = face->edge; do { // do something with edge... edge = edge->next; } while (edge = face->edge); next edge face
References Real time rendering 3rd edition : Cap 12 Slide e immagini da www.realtimerendering.com www.collada.org www.web3d.org Per prossima lezione 1 Ripasso Algebra lineare e trigonometria Slide corso Matematica per il discreto Appendici A e B Real-time rendering Ripasso Trasformazioni e Quaternioni Slide corso Grafica e Immagini Digitali Comunicazione Digitale - Prof. Marini Capitolo 4 Real-time rendering
Per prossima lezione 2 Studiare da soli codice es01_multiplecameras