Spiegazione della struttura dei file modello FBX
1. Struttura del file FBX
Questo è un file FBX di esempio.
La prima cosa da notare è che alcune righe iniziano con un punto e virgola: si tratta di commenti e devono essere ignorati durante la lettura del file.
Dopo il commento iniziale, viene trovato l'identificativo FBXHeaderExtension. Questo è il primo nodo principale della struttura del file. Il formato file FBX è infatti una struttura ad albero che segue il seguente schema:

Ogni nodo o nodo figlio può avere i propri attributi specifici. Gli attributi possono trovarsi anche al di fuori del nodo principale, ma di solito possono essere ignorati. In generale, la struttura di base di un nodo è la seguente:
nome del nodo: eventual_properties {
Node_Property_1: valore
Nodo_Proprietà_2: valore
Sottonodo1 : {
Subnode_Property_1: valore
[…]
}
Node_Property_3: valore
[…]
}
Questo è un nodo (il primo) trovato nel file di esempio:
FBXHeaderExtension: {
FBXHeaderVersion: 1003
Versione FBX: 6100
CreationTimeStamp: {
Versione: 1000
Anno: 2014
Mese: 03
Giorno: 20
Ora: 17
Minuto: 38
Secondo: 29
Millisecondo: 0
}
Creatore: "FBX SDK/FBX Plugins build 20070228"
Altri flag: {
Segnala PLE: 0
}
}
Comprendere la struttura è fondamentale per scrivere un parser efficiente.
Nel primo nodo troviamo due attributi (FBXHeaderVersion e FBXVersion) i cui valori rappresentano le versioni del formato. In questo caso si tratta della versione 6.1. Le altre informazioni possono essere ignorate a meno che non si desideri leggere anche la data di creazione (CreationTimeStamp).
2. Nodi oggetto FBX
Il nodo più importante è senza dubbio il nodo oggetto.
Il nodo oggetto contiene i vertici, gli indici, le normali, le coordinate UV e i materiali del modello. La sua struttura è la seguente:
Oggetti: {
Modello: 'nome del modello', 'Mesh' {
[...]
Vertici: [...]
IndiceVerticePoligono: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
Materiale: 'nome del materiale', '' { }
[...]
}
3. Vertice FBX
Come abbiamo visto, i vertici si trovano nella proprietà 'Vertex' dei nodi figli del modello.
La sintassi è la seguente:
Vertici: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
Ogni vertice ha tre coordinate spaziali (x,y,z), separate da virgole (che separano anche un vertice dall'altro). Le coordinate sono ovviamente espresse in forma decimale con i punti.
Ecco un esempio:
Vertici: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
I vertici che compongono il modello saranno:
v1(0.000000;0.104800;39.291698)
v2(00.000000,0.043400,-44.424301)
v3(0.000000,38.654301,-41.818802)
v4(0.000000,39.455002,44.424400)
4. Indice dei vertici del poligono FBX
L'indice si trova nella proprietà PolygonVertexIndex.
I file FBX possono esportare poligoni triangolari o più. La maggior parte dei file esporta poligoni quadrilaterali. La sintassi è simile a quella dei vertici, ma c'è una cosa da notare:
IndiceVerticePoligono: i1, i2,-i3, i4, i5,-i6,[...]
IndiceVerticePoligono: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
Gli indici che compongono un poligono sono in ordine; un indice negativo indica che si tratta dell'ultimo indice del poligono. L'indice deve essere impostato su un numero positivo, al quale bisogna poi sottrarre 1!
[Se vi state chiedendo il perché, è perché l'indice originale è tutto o niente con -1. Ad esempio, l'indice 3 diventa -4]
Ecco un esempio:
IndiceVerticePoligono: 8,7,3,-7,4,8,7,-3,0,5,8,-5
I poligoni che compongono il modello saranno:
p1(8,7,3,6)
p2(4,8,7,2)
p3(0,5,8,4)
Si noti che l'indice che indica la fine del poligono è stato impostato su un numero positivo, e da esso è stato poi sottratto 1.
Promemoria: le schede grafiche non gestiscono bene i quadrilateri, quindi ogni poligono con quattro lati deve essere suddiviso in due triangoli prima di visualizzare il modello.
5. Normali FBX
Le normali si trovano nel nodo figlio della proprietà Normals, LayerElementNormal (che a sua volta è un nodo figlio di Model). La sintassi è la stessa di quella utilizzata per i vertici, ovvero una serie di coordinate (x,y,z).
Normali: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
È necessario prestare attenzione alla proprietà MappingInformationType, che può assumere i seguenti valori:
▪ ByPolygon: per poligono, il che significa che ogni poligono del modello ha una normale.
▪ ByPolygonVertex: elaborato per vertice del poligono, il che significa che ogni vertice di ogni poligono del modello ha una normale. Ad esempio, se il modello ha 8 vertici che formano quattro quadrilateri, ci saranno 16 normali (1 normale * 4 poligoni * 4 vertici del poligono). Si noti che di solito i motori grafici richiedono che i vertici definiscano una sola normale. Quindi, se si trova un vertice con più di una normale, è possibile ignorare le normali trovate dopo la prima oppure calcolare la media di tutte le normali (normal smoothing).
▪ ByVertex: elaborazione per vertice, il che significa che ogni vertice del modello ha una normale. A volte chiamato ByVertice, come scritto nell'esportatore di Blender. Credo che l'autore sia spagnolo.
▪ ByEdge: elaborato per bordo, questo significa che ogni bordo del modello ha una normale (rara)
▪ AllSame: questo significa che ogni vertice del modello ha la stessa normale, il che è raro o impossibile per la maggior parte dei modelli.
Un'altra proprietà importante è la proprietà ReferenceInformationType, che può assumere i seguenti valori:
▪ Diretto: indica che le normali sono ordinate.
▪ IndexToDirect (o index nelle versioni precedenti del formato FBX): indica che l'ordine delle normali è dato dalla proprietà NormalsIndex.
Di seguito è riportato un esempio grafico che potrebbe risultare più chiaro del testo. Il modello di esempio è un piano sugli assi X e Y (quindi tutti i vertici avranno una coordinata Z pari a 0), composto da 9 vertici e 4 poligoni (quadrupli). L'immagine di esempio mostra una vista del piano dall'alto.

6. Coordinate UV FBX
Le coordinate UV si trovano nella proprietà UV del nodo figlio LayerElementUV (che a sua volta è un nodo figlio di Model). La sintassi è simile a quella dei vertici e delle normali, ma ovviamente ci saranno due coordinate anziché tre.
UV: u1, v1, u2, v2, [...]
È comunque necessario prestare attenzione alle proprietà MappingInformationType e ReferenceInformationType! Queste due proprietà possono avere gli stessi valori delle normali, quindi si applicano le stesse regole. La proprietà indice (se presente, ovvero se è definita IndexToDirect) è UVIndex.
