FBX Model File Structure Explained
1. FBX file structure
This is a sample FBX file.
The first thing to note is that some lines begin with a semicolon: these are comments and must be ignored when reading the file.
After the initial comment, the identifier FBXHeaderExtension is found. This is the first main node of the file structure. The FBX file format is indeed a tree structure that follows the following scheme:

Each node or child node can have its own specific attributes. Attributes can also be found outside of the main node, but can usually be ignored. In general, the basic structure of a node is as follows:
node name: eventual_properties { <---- beginning of node
Node_Property_1: value
Node_Property_2: value
Subnode1 : { <---- beginning of subnode
Subnode_Property_1: value
[…]
} <---- end of subnode
Node_Property_3: value
[…]
} <---- end of node
This is a node (the first one) found in the example file:
FBXHeaderExtension: { <---- beginning of node
FBXHeaderVersion: 1003 <---- node property
FBXVersion: 6100
CreationTimeStamp: { <---- beginning of subnode (1)
Version: 1000 <---- subnode property
Year: 2014
Month: 03
Day: 20
Hour: 17
Minute: 38
Second: 29
Millisecond: 0
} <---- end of subnode (1)
Creator: "FBX SDK/FBX Plugins build 20070228"
OtherFlags: { <---- beginning of subnode (2)
FlagPLE: 0
} <---- end of subnode (2)
}
Understanding structure is the basis for writing an efficient parser.
In the first node we find two attributes (FBXHeaderVersion and FBXVersion) whose values are format versions. In this case it is version 6.1. The other information can be ignored unless one also wants to read the creation date (CreationTimeStamp).
2. FBX object nodes
The most important node is definitely the object node.
The object node contains the vertices, indexes, normals, UV coordinates and materials of the model. Its structure is as follows:
Objects: { <---- beginning of node Objects
Model: ‘model name’, ‘Mesh’ { <---- beginning of node of the model
[...]
Vertices: [...] <---- vertices
PolygonVertexIndex: [...] <---- indices
LayerElementNormal: { } <---- node of the normals
LayerElementUV: { } <---- node of the UV coords
} <---- end of node of the model
Material: ‘material name’, ‘’ { } <---- node of the material
[...]
} <---- end of node Objects
3. FBX Vertex
As we have seen, vertices can be found in the ‘Vertex’ property of the model's child nodes.
The syntax is as follows:
Vertices: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
Each vertex has three spatial coordinates (x,y,z), separated by commas (also separating one vertex from another). The coordinates are obviously expressed in decimal form with dots.
An example is as follows:
Vertices: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
The vertices that make up the model will be:
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. Vertex index of FBX polygon
The index can be found under the PolygonVertexIndex property.
FBX files can export trilateral polygons (triangles) or more. Most files export quadrilateral polygons (quads). The syntax is similar to vertices, but there is one thing to note:
PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[...] <-- triangles syntax
PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...] <-- quads syntax
The indices that make up a polygon are in order, a negative index means that it is the last index of the polygon. The index needs to be set to a positive number, and then you have to subtract 1 from it!
[If you're wondering why, it's because the original index is all-or-nothing with -1. For example index 3 becomes -4]
The example is as follows:
PolygonVertexIndex: 8,7,3,-7,4,8,7,-3,0,5,8,-5
The polygons that make up the model will be:
p1(8,7,3,6)
p2(4,8,7,2)
p3(0,5,8,4)
Note that the index indicating the end of the polygon has been set to a positive number, and then subtract 1 from it.
Reminder: Graphics cards do not like quadrilaterals, so each polygon with four sides must be split into two triangles before displaying the model.
5. FBX Normals
Normals can be found under the Normals property's child node LayerElementNormal (which in turn is a child node of Model). The syntax is the same as for one of the vertices, i.e. a series of (x,y,z) coordinates.
Normals: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
You need to pay attention to the MappingInformationType property, which can have the following values:
▪ ByPolygon: by polygon, which means that each polygon of the model has a normal.
▪ ByPolygonVertex: processed by polygon vertex, which means that each vertex of each polygon of the model has a normal. For example, if the model has 8 vertices forming four quads, there will be 16 normals (1 normal * 4 polygons * 4 polygon vertices). Note that usually game engines need vertices to define only one normal. So if you find a vertex with more than one normal, you can either ignore the normals found after the first one, or calculate the average of all normals (normal smoothing).
▪ ByVertex: per-vertex processing, which means that each vertex of the model has a normal. Sometimes called ByVertice, as written in the Blender exporter. I think the author is Spanish.
▪ ByEdge: processed by edge, this means that each edge of the model has a normal (rare)
▪ AllSame: this means that every vertex of the model has the same normal, which is rare or impossible for most models.
Another important property is the ReferenceInformationType property, which can have the following values:
▪ Direct: indicates that the normals are ordered.
▪ IndexToDirect (or index in older versions of the FBX format): indicates that the order of the normals is given by the NormalsIndex property.
Below is a graphical example that may be clearer than the text. The example model is a plane on the X and Y axes (so all vertices will have a Z-coordinate of 0), consisting of 9 vertices and 4 polygons (quads). The example image is a view of the plane from the top.

6. FBX UV coordinates
The UV coordinates can be found in the UV property under the child node LayerElementUV (which is in turn a child node of Model). The syntax is similar to that of vertices and normals, but of course there will be two coordinates instead of three.
UV: u1, v1, u2, v2, [...]
You still need to pay attention to the MappingInformationType and ReferenceInformationType properties! These two properties can have the same values as the normals, so the same rules apply. The index property (if any, i.e. IndexToDirect is defined) is UVIndex.