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