Formati OBJ e RAW
Transcript
Formati OBJ e RAW
1. Il formato obj 1.1. Introduzione Un file object (obj) rappresenta un formato sviluppato da Wavefront Techonologies usato per definire la geometria a altre proprietà di oggetti grafici. Tramite questo formato possono essere elencate tutte le informazioni per la definizione di linee, poligoni, curve e superfici freeform. Le linee e i poligoni sono descritti in termini dei loro vertici mentre curve e superfici sono definite tramite speciali punti di controllo e altri parametri che dipendono dal tipo di curva (Bezier, B-Spline, ecc.). Spesso un file obj è utilizzato per l'interscambio di oggetti grafici tra diverse piattaforme di visualizzazione. In questo documento, utilizzeremo Blender come programma di riferimento per gli esempi. Facendo degli esperimenti abbiamo osservato che vengono importati correttamente in Blender solo gli oggetti racchiusi in file obj costituiti da facce, linee e punti. In altre parole, non vengono visualizzate strutture speciali composte da curve e superfici. Per questo motivo in questo documento non tratteremo le superfici freeform. Per avere una visione più approfondita consigliamo la lettura in [1]. 1.2. Keywords La struttura di un file obj è molto semplice. Non è necessario includere un header all'inizio del file. Spesso il file inizia con un breve commento contenente informazioni sull'oggetto/i definito/i nel file. I commenti (in linea) su un file obj sono individuati dal carattere "#". Ogni riga inizia con una keyword seguita dai dati di riferimento per tale keyword. Ecco a seguire una lista delle più importanti keywords che possono essere trovate in un file obj. Le prossime sezioni di questo documento descrivono la sintassi di ciascuna keyword e come queste vengono combinate per la definizione degli oggetti. Tipo di dato Informazioni sui vertici Elementi grafici Raggruppamento Attribuiti di Display/Render Keyword v vt vn p l f g s o usemtl mtlib Descrizione Coordinate vertice Coordinate texture Direzione delle normali Punto Linea Faccia Nome di un gruppo Parametro di smoothing di un gruppo Nome di un oggetto Nome del materiale Nome del file mtl di riferimento Tabella . Alcune importanti keywords supportate in un file obj 1.2.1 Informazioni sui vertici Tipo di vertice Coordinate vertice Sintassi vxyzw Descrizione Definisce un vertice geometrico con le rispettive coordinate lungo le tre dimensioni (x, y, z). I vertici elencati nel file obj sono numerati in ordine di apparizione. Ciò significa che il primo vertice sarà etichettato "1", il secondo "2" e così via. Questa indicizzazione sarà utile, come vedremo nella prossima sezione, alla combinazione dei vertici per costituire un oggetto. Il quarto parametro "w" rappresenta una coordinata omogenea utile nel caso in cui bisogna rappresentare curve o superfici. Se omesso, il valore di default per "w" è 1.0. Tutti i parametri sono rappresentati in formato float. Definisce come avviene la mappatura UV di una texture. "u, v, w" sono numeri float compresi tra 0 e 1 che indicano dove mappare la texture lungo le tre Coordinate texture vt u v w direzioni. Se la texture è controllata lungo una sola direzione orizzontale allora deve essere specificato solo "u". In questo caso gli altri due parametri Direzione delle normali vn i j k assumono il valore di default 0. Specifica le componenti i, j e k della normale al vertice di riferimento. 1.2.2. Elementi grafici Una volta che abbiamo definito i vertici, tramite differenti "elementi grafici" possiamo relazionare queste informazioni per costituire l'oggetto desiderato. Possiamo definire così facce, linee o singoli punti nello spazio. I vertici elencati nel file obj sono indicizzati per ordine di apparizione nell'elenco. Questo vale per ogni categoria di vertice dichiarato. Elemento Sintassi Punto p v1 v2 v3 ... Descrizione Specifica un punto nello spazio. "v1" è la posizione del primo punto (corrispondente al primo vertice elencato nel file). Ovviamente, ogni punto richiede un vertice. Possono essere rappresentati molti punti su una singola riga (Es: p v1 v2 .... vN). Specifica una linea composta da un minimo di 2 punti. Ogni "v#" è il vertice di un punto in una linea. Accanto all'indice del vertice può essere presente Linea l v1/vt1 v2/vt2 ... l'informazione sulla mappatura di una texture. L'informazione sul vertice e sulla texture è separata da uno "/" (senza includere spazi). Una linea può essere definita senza includere informazione sulla texture (Es: l v1 v2). Specifica una faccia composta da almeno 3 vertici. Accanto a ciascun vertice possono essere elencate le informazioni su texture e normali. L'informazione sulla texture (relativa a un determinato vertice "vt" elencato precedentemente) precede sempre l'informazione sulle normali. Se vengono f v1/vt1/vn1 Faccia v2/vt2/vn2 v3/vt3/vn3 ... incluse le informazioni su texture e normali per un vertice, devono essere incluse in tutti i vertici che costituiscono la faccia. Nel caso in cui abbiamo solo le informazioni sulla posizione dei vertici e le corrispondenti informazioni sulle normali possiamo combinare assieme queste informazioni con la seguente sintassi: f 1//1 2//2 3//3 4//4 (faccia composta da 4 vertici con informazione sulle normali) La più semplice definizione di una faccia è costituita da tre vertici senza ulteriori informazioni (Es: f v1 v2 v3). Esempi Oggetto rappresentato Quadrato in cui ogni lato misura 2 unità. Non vengono date informazioni sulle normali per cui le facce hanno per default posizione positiva verso la posizione della camera. Cubo in cui ogni faccia misura 2 unità. Ogni vertice è condiviso da tre facce. Lo stesso cubo di prima solo che i vertici che costituiscono ogni faccia sono indicizzati dal basso verso l'alto. Ciò significa che l'ultimo vertice elencato nel file obj verrà indicizzato come "-1", il penultimo come "-2" e così via. Quadrato in cui ogni lato misura 2 unità. Vengono elencate anche le informazioni sulla normale (positive). Quadrato in cui ogni lato misura 2 unità. Vengono elencate anche le informazioni sulla normale (negative). Codice Render # Blender v2.59 (sub 0) OBJ File: # square.obj v v v v 2.000000 2.000000 0.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 0.000000 1.000000 0.000000 -1.000000 #mettere f 1 4 3 2 è equivalente a #mettere f 1 2 3 4 o f 4 3 2 1. f 1 4 3 2 # Blender v2.59 (sub 0) OBJ File: # cube.obj v v v v v v v v 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 f f f f f f # # 1 2 3 4 5 8 7 6 1 5 6 2 2 6 7 3 3 7 8 4 5 1 4 8 Blender v2.59 (sub 0) OBJ File: '' cube_neg.obj v v v v v v v v 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 f f f f f f # # -8 -7 -6 -5 -4 -1 -2 -3 -8 -4 -3 -7 -7 -3 -2 -6 -6 -2 -1 -5 -4 -8 -5 -1 Blender v2.59 (sub 0) OBJ File: '' square_normals_pos.obj -1.000000 -1.000000 -1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 v 2.000000 0.000000 -1.000000 v 0.000000 0.000000 -1.000000 v 0.000000 0.000000 1.000000 v 2.000000 0.000000 1.000000 vn 0.000000 1.000000 0.000000 f 1//1 2//1 3//1 4//1 # Blender v2.59 (sub 0) OBJ File: '' # square_normals_neg.obj v 2.000000 0.000000 -1.000000 v 0.000000 0.000000 -1.000000 v 0.000000 -0.000000 1.000000 v 2.000000 -0.000000 1.000000 vn 0.000000 -1.000000 -0.000000 f 1//1 4//1 3//1 2//1 1.2.3 Raggruppamento In questa sezione vengono analizzate alcune nozioni sul raggruppamento di oggetti. In questo modo possono essere realizzate collezioni di oggetti (linee, facce, vertici, ecc.) che rendono più semplice le future manipolazioni su un modello. Elemento Sintassi Nome di un gruppo g name1 name2 ... Descrizione Definisce il nome del gruppo di appartenenza per un oggetto. Utile per organizzare collezioni di elementi e semplificare la manipolazione del modello. Un oggetto può appartenere a più gruppi contemporaneamente. Se viene omesso il gruppo per un oggetto, assume il valore "default". Questo parametro indica gli elementi sulle quali le normali sono Parametro di smoothing di un gruppo s group_number interpolate per attribuire all'elemento un'apparenza "smooth". Il valore di default è "off" o "0"; in questo caso non viene adoperato nessun valore di smoothing. Parametro opzionale per dare un nome all'oggetto definito subito dopo Nome di un oggetto o object_name nel file obj. Tutti gli elementi di raggruppamento vengono applicati a tutti gli oggetti sottostanti nel file fino a quando un nuovo gruppo viene dichiarato. Esempi Oggetto rappresentato Cubo in cui ogni faccia misura 2 unità. Ogni vertice è condiviso da tre facce. Raggruppiamo i vertici di ogni faccia e diamo un nome a piacere per ciascuna di esse. Codice Render # Blender v2.59 (sub 0) OBJ File: '' # cube_group_names.obj o cube_name v v v v v v v v 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 g f g f g f g f g f g f bottom 1 2 3 4 Top 5 8 7 6 front 1 5 6 2 left 2 6 7 3 back 3 7 8 4 right 5 1 4 8 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 Due quadrati adiacenti con due vertici in comune. I due quadrati sono racchiusi in uno "smoothing group" per garantire che i loro due vertici in comune siano smussati durante la fase di renderizzazione. Gli stessi quadrati dell'esempio precedente senza includere uno "smoothing group". Gli stessi quadrati dei due esempi precedenti, senza smoothing group, con l'aggiunta di informazione sulle normali. # Blender v2.59 (sub 0) OBJ File: '' # square_smouthing_group.obj o v v v v v v 2_square 0.000000 -1.000000 -1.000000 0.000000 -1.000000 1.000000 -0.000000 1.000000 1.000000 -0.000000 1.000000 -1.000000 -1.000000 1.000000 -2.000000 -1.000000 -1.000000 -2.000000 g s f f # # all 1 1 4 3 2 4 1 6 5 Blender v2.59 (sub 0) OBJ File: '' square_without_smouthing_group.obj o v v v v v v 2_square 0.000000 -1.000000 -1.000000 0.000000 -1.000000 1.000000 -0.000000 1.000000 1.000000 -0.000000 1.000000 -1.000000 -1.000000 1.000000 -2.000000 -1.000000 -1.000000 -2.000000 g s f f # # o v v v v v v all off 1 4 3 2 4 1 6 5 Blender v2.59 (sub 0) OBJ File: '' square_vertex normals.obj 2_square 0.000000 -1.000000 -1.000000 0.000000 -1.000000 1.000000 -0.000000 1.000000 1.000000 -0.000000 1.000000 -1.000000 -1.000000 1.000000 -2.000000 -1.000000 -1.000000 -2.000000 vn vn vn vn vn vn g s f f 0.000000 0.000000 0.276597 0.276597 0.531611 0.531611 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 1.000000 0.960986 0.960986 0.846988 0.846988 all 1 1//1 4//4 3//3 2//2 4//4 1//1 6//6 5//5 1.2.4 Attributi di Display/Render Indicano una serie di attribuiti che vengono assegnati agli oggetti durante la fase di renderizzazione. Elemento Sintassi Nome del materiale usemtl material_name Nome del file mtl di riferimento Descrizione Definisce il nome del materiale da assegnare all'oggetto. Il mtllib filename1 filename2 ... materiale deve essere definito separatamente in un file mtl. Specifica il nome del file mtl contenente i materiali. Possono essere definiti più file mtl contemporaneamente. Esempi Oggetto rappresentato Cubo in cui ogni faccia misura 2 unità. Le 6 facce del cubo sono raggruppate per facilitare la manipolazione. Su ciascuna faccia è applicato un materiale descritto nel file cube_with_materials.mtl. Codice Render # Blender v2.59 (sub 0) OBJ File: '' # cube_with_materials.obj mtllib cube_con_materiali.mtl o cube_name v v v v v v v v 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 g bottom usemtl red f 1 2 3 4 g Top usemtl blue f 5 8 7 6 g front usemtl green f 1 5 6 2 g left usemtl gold f 2 6 7 3 g back usemtl orange f 3 7 8 4 g right usemtl purple f 5 1 4 8 1.3. Definizione di un Material Library file (MTL file) Un file MTL contiene informazioni ausiliarie per la definizione dei materiali un oggetto. Il file obj deve richiamare il file MTL di riferimento tramite la parola chiave "mtllib". Dentro un file MTL sono definiti tutti i materiali per la scena di riferimento. Per accedere al materiale desiderato bisogna usare la seguente sintassi all'interno del file obj: "usemtl material_name". Possono essere elencati differenti materiali all'interno del file mtl, ognuno inizia con la parola chiave "newmtl". Anche in questo formato i commenti sono individuati dal carattere "#". Vediamo adesso come è definito un materiale dentro un file MTL. Partiremo da un semplice esempio spiegandolo passo dopo passo. Per una visione più approfondita dei parametri in un file mtl consigliamo la lettura in [2]. #Definiamo un nuovo materiale dal nome "material_name" newmtl material_name Ka 0.1986 0.0000 0.0000 Kd 0.5922 0.0166 0.0000 Ks 0.5974 0.2084 0.2084 illum 2 Ns 100.2237 map_Ka lenna.tga # the ambient texture map map_Kd lenna.tga # the diffuse texture map map_Ks lenna.tga # the specular texture map map_d lenna_alpha.tga # the alpha texture map Tabella . Esempio di file mtl • Ka r g b: definisce il colore della luce ambientale del materiale. Il valore di default è (0.2, 0.2, 0.2). • Kd r g b: definisce il colore della luce diffusa del materiale. Il valore di default è (0.8 0.8 0.8). • Ks r g b: definisce il colore della luce speculare del materiale. Il valore di default è (1.0, 1.0, 1.0). • Ns s: definisce la quantità di specularità attribuita tramite il parametro "Ks". I valori permessi variano nel range 0-1000. • d: definisce il canale alpha di trasparenza. Il valore di default è 1.0 (nessuna trasparenza). In alcuni formati è definito il parametro "Tr" al posto di "d". Il significato è del tutto analogo. • illum n: indica la modalità di illuminazione della scena. I parametri permessi sono i seguenti: 1. Color on and Ambient off 2. Color on and Ambient on 3. Highlight on 4. Reflection on and Ray trace on 5. Transparency: Glass on, Reflection: Ray trace on 6. Reflection: Fresnel on and Ray trace on 7. Transparency: Refraction on, Reflection: Fresnel off and Ray trace on 8. Transparency: Refraction on, Reflection: Fresnel on and Ray trace on 9. Reflection on and Ray trace off 10. Transparency: Glass on, Reflection: Ray trace off 11. Casts shadows onto invisible surfaces • Precisiamo che se viene specificato un valore di "illum" che include proprietà di specularità del colore, allora deve è necessario elencare le informazione sul colore tramite il parametro "Ks". • map_Ka (oppure map_kd, map_Ks) filename: indica un file contenente una texture map da applicare a una delle fonti di colore del materiale (diffuso, speculare, ambientale). Vedi esempio in tabella 2. 2. Il formato raw Questo tipo di formato è molto più semplice rispetto al formato obj. I file raw contengono oggetti mesh poligonali che consistono soltanto di poligoni triangolari. Questo significa che tutti i poligoni presenti nella scena vengono convertiti in modo tale che ogni faccia sia un triangolo. I dati relativi alla dichiarazione di una singola faccia triangolare possono essere definiti in tre differenti modi: 1. Nove numeri per triangolo: Ax Ay Az Bx By Bz Cx Cy Cz. Ogni tripletta rappresenta le coordinate lungo le tre dimensioni per il vertice corrispondente. 2. Dodici numeri per triangolo: R G B Ax Ay Az Bx By Bz Cx Cy Cz. Uguale al precedente con l'aggiunta delle informazioni sul colore (RGB) nel range 0.0 - 1.0. 3. Nove numeri per triangolo e texture: Ax Ay Az Bx By Bz Cx Cy Cz texture_name. In questo caso oltre alla dichiarazione delle coordinate dei vertici viene elencato pure il nome della texture da mappare nella faccia triangolare. Facendo degli esperimenti nel programma Blender abbiamo verificato che l'unica sintassi accettata è la prima. Di default, Blender non contiene il plugin per l'importazione/esportazione in formato raw. Informazioni sull'installazione del plugin sono riportate in [3]. Oggetto rappresentato Cubo in cui ogni faccia misura 2 unità. Durante l'esportazione in formato raw, ogni faccia del cubo viene divisa in due triangoli. Codice 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 3. Referenze [1] Material Definitions for OBJ Files, http://people.sc.fsu.edu/~jburkardt/data/mtl/mtl.html [2] [3] MTL material format, http://paulbourke.net/dataformats/mtl/ Raw Triangle File Format Import/Export, http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/ImportExport/Raw_Mesh_IO Render