Explicación de la estructura de archivos del modelo FBX
1. Estructura del archivo FBX
Este es un archivo FBX de ejemplo.
Lo primero que hay que tener en cuenta es que algunas líneas empiezan con un punto y coma: se trata de comentarios y deben ignorarse al leer el archivo.
Tras el comentario inicial, se encuentra el identificador FBXHeaderExtension. Este es el primer nodo principal de la estructura del archivo. El formato de archivo FBX es, en efecto, una estructura de árbol que sigue el siguiente esquema:

Cada nodo o nodo hijo puede tener sus propios atributos específicos. También se pueden encontrar atributos fuera del nodo principal, pero generalmente se pueden ignorar. En general, la estructura básica de un nodo es la siguiente:
nombre del nodo: eventual_properties {
Node_Property_1: valor
Node_Property_2: valor
Subnodo1: {
Subnode_Property_1: valor
[…]
}
Node_Property_3: valor
[…]
}
Este es un nodo (el primero) que se encuentra en el archivo de ejemplo:
FBXHeaderExtension: {
FBXHeaderVersion: 1003
Versión FBX: 6100
CreationTimeStamp: {
Versión: 1000
Año: 2014
Mes: 03
Día: 20
Hora: 17
Minuto: 38
Segundo: 29
Milisegundos: 0
}
Creador: "FBX SDK/FBX Plugins compilación 20070228"
Otras banderas: {
BanderaPLE: 0
}
}
Comprender la estructura es la base para escribir un analizador sintáctico eficiente.
En el primer nodo encontramos dos atributos (FBXHeaderVersion y FBXVersion) cuyos valores corresponden a versiones de formato. En este caso, se trata de la versión 6.1. La demás información puede ignorarse a menos que también se desee consultar la fecha de creación (CreationTimeStamp).
2. Nodos de objetos FBX
El nodo más importante es sin duda el nodo objeto.
El nodo de objeto contiene los vértices, índices, normales, coordenadas UV y materiales del modelo. Su estructura es la siguiente:
Objetos: {
Modelo: 'nombre del modelo', 'Malla' {
[...]
Vértices: [...]
PolygonVertexIndex: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
Material: 'nombre del material', '' { }
[...]
}
3. Vértice FBX
Como hemos visto, los vértices se pueden encontrar en la propiedad 'Vertex' de los nodos hijos del modelo.
La sintaxis es la siguiente:
Vértices: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
Cada vértice tiene tres coordenadas espaciales (x, y, z), separadas por comas (que también separan un vértice de otro). Obviamente, las coordenadas se expresan en forma decimal con puntos suspensivos.
Un ejemplo es el siguiente:
Vértices: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
Los vértices que componen el modelo serán:
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. Índice de vértice del polígono FBX
El índice se puede encontrar en la propiedad PolygonVertexIndex.
Los archivos FBX pueden exportar polígonos triláteros (triángulos) o más. La mayoría de los archivos exportan polígonos cuadriláteros (cuadriláteros). La sintaxis es similar a la de los vértices, pero hay algo que tener en cuenta:
PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[...]
PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
Los índices que componen un polígono están en orden; un índice negativo significa que es el último índice del polígono. El índice debe establecerse en un número positivo, ¡y luego hay que restarle 1!
[Si te preguntas por qué, es porque el índice original es de todo o nada con -1. Por ejemplo, el índice 3 se convierte en -4]
El ejemplo es el siguiente:
PolygonVertexIndex: 8,7,3,-7,4,8,7,-3,0,5,8,-5
Los polígonos que componen el modelo serán:
p1(8,7,3,6)
p2(4,8,7,2)
p3(0,5,8,4)
Tenga en cuenta que el índice que indica el final del polígono se ha establecido en un número positivo, y luego réstele 1.
Recordatorio: Las tarjetas gráficas no admiten cuadriláteros, por lo que cada polígono de cuatro lados debe dividirse en dos triángulos antes de mostrar el modelo.
5. Normales FBX
Las normales se encuentran en el nodo hijo LayerElementNormal de la propiedad Normals (que a su vez es un nodo hijo de Model). La sintaxis es la misma que para uno de los vértices, es decir, una serie de coordenadas (x,y,z).
Normales: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
Debes prestar atención a la propiedad MappingInformationType, que puede tener los siguientes valores:
▪ PorPolígono: por polígono, lo que significa que cada polígono del modelo tiene una normal.
▪ ByPolygonVertex: procesado por vértice de polígono, lo que significa que cada vértice de cada polígono del modelo tiene una normal. Por ejemplo, si el modelo tiene 8 vértices que forman cuatro cuadriláteros, habrá 16 normales (1 normal * 4 polígonos * 4 vértices de polígono). Tenga en cuenta que, por lo general, los motores de juegos necesitan que los vértices definan una sola normal. Por lo tanto, si encuentra un vértice con más de una normal, puede ignorar las normales posteriores a la primera o calcular el promedio de todas ellas (suavizado de normales).
▪ ByVertex: procesamiento por vértice, lo que significa que cada vértice del modelo tiene una normal. A veces se le llama ByVertice, como aparece escrito en el exportador de Blender. Creo que el autor es español.
▪ ByEdge: procesado por borde, esto significa que cada borde del modelo tiene una normal (rara)
▪ AllSame: esto significa que cada vértice del modelo tiene la misma normal, lo cual es raro o imposible para la mayoría de los modelos.
Otra propiedad importante es la propiedad ReferenceInformationType, que puede tener los siguientes valores:
▪ Directo: indica que las normales están ordenadas.
▪ IndexToDirect (o índice en versiones anteriores del formato FBX): indica que el orden de las normales viene dado por la propiedad NormalsIndex.
A continuación se muestra un ejemplo gráfico que puede resultar más claro que el texto. El modelo de ejemplo es un plano sobre los ejes X e Y (por lo que todos los vértices tendrán una coordenada Z de 0), compuesto por 9 vértices y 4 polígonos (cuadriláteros). La imagen de ejemplo muestra el plano desde arriba.

6. Coordenadas UV FBX
Las coordenadas UV se encuentran en la propiedad UV del nodo hijo LayerElementUV (que a su vez es un nodo hijo de Model). La sintaxis es similar a la de los vértices y las normales, pero, por supuesto, habrá dos coordenadas en lugar de tres.
UV: u1, v1, u2, v2, [...]
Aún debes prestar atención a las propiedades MappingInformationType y ReferenceInformationType. Estas dos propiedades pueden tener los mismos valores que las normales, por lo que se aplican las mismas reglas. La propiedad de índice (si existe, es decir, IndexToDirect está definida) es UVIndex.
