The nodes of an ASCII FBX file hold a scene: objects such as meshes, models, materials and animation curves, and connections that join them. This page describes FBX 7 files, which are what current software writes, and notes where FBX 6 differs. Autodesk documents the scene through its SDK’s classes but not the nodes in the file; what is here comes from the FBX SDK’s documentation of those classes, Autodesk’s sample files, and the notes of the Blender developers, who describe much of it as worked out from files. How the text is written is on Syntax.
Top-level nodes
| Node | Holds |
|---|---|
FBXHeaderExtension | the file header: versions, creation time, the program that wrote it, scene information |
FileId | 16 bytes of data, apparently derived from the creation time, where present |
CreationTime | a string such as "2013-08-05 10:27:44:000" |
Creator | a string naming the program that wrote the file |
GlobalSettings | axes, units, frame rate and time span |
Documents | Count (1 in the files seen) and one Document: an id, an empty string, "Scene", with SourceObject and ActiveAnimStackName properties and RootNode: 0 |
References | usually empty; its use is not known |
Definitions | object counts and property templates |
Objects | every object in the scene |
Connections | how the objects are joined |
Takes | the older animation system: take names and time spans; may be empty |
FBXHeaderExtension
| Child | Value |
|---|---|
FBXHeaderVersion | integer, 1003 in the files seen |
FBXVersion | integer, the version times 1000, such as 7400; FBX 6 files have 6000 or 6100 |
EncryptionType | integer, 0 |
CreationTimeStamp | children Version (1000), Year, Month, Day, Hour, Minute, Second, Millisecond |
Creator | string, such as the FBX SDK or plug-in version |
SceneInfo | "SceneInfo::GlobalInfo", "UserData", with MetaData (title, subject, author, keywords, revision, comment) and properties such as Original|ApplicationName and LastSaved|DateTime_GMT |
Properties70
Most settings of an object are in a child node Properties70 (in FBX 6,
Properties60, whose entries are Property nodes with three
strings before the value), which holds one P node per property. Each
P has four strings, then the value:
| Position | Meaning | Example |
|---|---|---|
| 1 | the property name; a | separates a compound from its member | "Lcl Translation", "Original|FileName" |
| 2 | the data type | "Lcl Translation", "double", "int", "enum", "bool", "ColorRGB", "KString", "KTime", "object", "Compound" |
| 3 | a label or second type name | "Number", "Integer", "Color", "Vector", "Time", or "" |
| 4 | flags, letters | "", "A", "A+", "U" |
| 5 on | the value: none for object and Compound, one number or string, or three numbers for vectors and colours | 0,1.5,0 |
Flags: A means the property can be animated; + follows
A and is thought to mean it is animated; U marks a property
the user added. H (possibly hidden) and L followed by a digit
(possibly locked channels as bits) are guesses. For an animatable property the type and
label positions shift: a plain double is "double", "Number", but an
animatable one is written as "Number", "".
GlobalSettings
GlobalSettings has Version: 1000 and a
Properties70 with these, among others:
| Property | Meaning |
|---|---|
UpAxis, UpAxisSign | the up axis: 0 X, 1 Y, 2 Z; sign 1 or −1 |
FrontAxis, FrontAxisSign | the front axis, likewise |
CoordAxis, CoordAxisSign | the third axis, likewise, which fixes the handedness |
OriginalUpAxis, OriginalUpAxisSign | the up axis of the program that made the scene |
UnitScaleFactor, OriginalUnitScaleFactor | the size of one unit in centimetres: 1 for centimetres, 100 for metres, 2.54 for inches |
AmbientColor | the ambient light colour |
DefaultCamera | the name of the camera to view through, such as "Producer Perspective" |
TimeMode | the frame rate, from the table below |
TimeProtocol | how time is shown: 0 SMPTE, 1 frame count, 2 default |
SnapOnFrameMode | 0 no snap, 1 snap, 2 play on frames, 3 snap and play |
TimeSpanStart, TimeSpanStop | the scene’s time span, in KTime |
CustomFrameRate | frames per second when TimeMode is 14, otherwise −1 |
| TimeMode | Rate | TimeMode | Rate |
|---|---|---|---|
| 0 | default | 9 | NTSC full frame (29.97) |
| 1 | 120 | 10 | PAL (25) |
| 2 | 100 | 11 | 24 |
| 3 | 60 | 12 | 1000 |
| 4 | 50 | 13 | film full frame (23.976) |
| 5 | 48 | 14 | custom: see CustomFrameRate |
| 6 | 30 | 15 | 96 |
| 7 | 30, drop frame | 16 | 72 |
| 8 | NTSC drop frame (29.97) | 17 | 59.94 |
Definitions
Definitions has Version: 100, Count (the number
of objects) and one ObjectType node per kind of object, whose value is the
kind ("Model", "Geometry", "Material"…). Each
ObjectType has a Count and usually a
PropertyTemplate, named by an SDK class such as "FbxNode" or
"FbxMesh" ("KFbxNode" in 7.3 files), whose
Properties70 gives default values. An object’s own
Properties70 lists only what differs from its template.
Objects
Every child of Objects has three values: a unique 64-bit id, the class and
name joined ("Model::Cube"), and a subclass. Id 0 is the scene root. FBX 6
files have no ids: objects are known by their Class::Name strings, and the
node has just those two strings.
| Node | Subclasses | What it is |
|---|---|---|
Model | Mesh, Null, LimbNode, Camera, Light, CameraSwitcher | a node in the scene hierarchy, with its transform |
Geometry | Mesh, Shape, NurbsCurve | a mesh, a blend shape target, or a curve; connected to a Model or a blend shape channel |
NodeAttribute | Camera, Light, Null, LimbNode, CameraSwitcher | the data of a camera, light, empty or bone, connected to a Model |
Material | "" | a surface material: Version: 102, ShadingModel ("phong" or "lambert"), MultiLayer, colour and factor properties |
Texture | "" | a texture: its file name, relative file name, mapping and UV settings |
Video | "Clip" | the image file behind a texture, with an optional embedded copy in Content, in base64 |
Deformer | Skin, Cluster, BlendShape, BlendShapeChannel | skinning and blend shapes; a cluster holds one bone’s Indexes, Weights, Transform and TransformLink |
Pose | "BindPose" | the bind pose: PoseNode children each with a Node id and a Matrix |
AnimationStack | "" | an animation clip (take) |
AnimationLayer | "" | a layer of a stack |
AnimationCurveNode | "" | joins curves to an animated property |
AnimationCurve | "" | one animated channel: keys and values |
Meshes
A Geometry of subclass "Mesh" has
GeometryVersion (124 in the files seen) and these arrays:
| Child | Contents |
|---|---|
Vertices | x, y, z of each control point |
PolygonVertexIndex | the vertices of each polygon in turn; the last index of each polygon is stored as −(index + 1), so a negative number ends the polygon |
Edges | optional: each edge as a position in PolygonVertexIndex; the edge runs from that polygon vertex to the next one in its polygon |
Further data per vertex, per polygon or per corner sits in layer elements:
| Node | Arrays |
|---|---|
LayerElementNormal | Normals (and NormalsW) |
LayerElementBinormal | Binormals |
LayerElementTangent | Tangents |
LayerElementUV | UV, UVIndex |
LayerElementColor | Colors, ColorIndex |
LayerElementSmoothing | Smoothing, integers used as booleans |
LayerElementMaterial | Materials: per polygon, the index of the material among those connected to the model |
Each layer element has a number as its value, its Version, a
Name, and two strings that say how its values map onto the mesh:
| Field | Value | Meaning |
|---|---|---|
MappingInformationType | "ByVertice" (also "ByVertex") | one value per control point |
"ByPolygonVertex" | one value per corner, in PolygonVertexIndex order | |
"ByPolygon" | one value per polygon | |
"ByEdge" | one value per edge | |
"AllSame" | one value for the whole mesh | |
ReferenceInformationType | "Direct" | the n-th item takes the n-th value |
"IndexToDirect" (older files: "Index") | the n-th item takes the value at the n-th entry of the index array; −1 means none |
A Layer node (Version: 100) gathers one element of each
kind, each named by a LayerElement child with Type and
TypedIndex. Layer 0 is the main one.
Model transforms
A Model’s position is given by properties in its
Properties70, relative to its parent:
| Property | Meaning |
|---|---|
Lcl Translation, Lcl Rotation, Lcl Scaling | translation, rotation (Euler angles in degrees) and scale |
RotationOrder | 0 XYZ, 1 XZY, 2 YZX, 3 YXZ, 4 ZXY, 5 ZYX, 6 spheric XYZ |
PreRotation, PostRotation | fixed rotations before and after the animated one |
RotationOffset, RotationPivot | the offset and pivot of the rotation |
ScalingOffset, ScalingPivot | the offset and pivot of the scale |
GeometricTranslation, GeometricRotation, GeometricScaling | a transform of the attached geometry only, not passed to children |
InheritType | how parent scale is inherited: 0 RrSs, 1 RSrs, 2 Rrs (parent scale ignored) |
RotationActive | whether the pre- and post-rotations and pivots apply |
The FBX SDK’s documentation gives the local matrix as
T × Roff × Rp × Rpre × R × Rpost−1 × Rp−1 × Soff × Sp × S ×
Sp−1, where R is built from Lcl Rotation in
RotationOrder.
Connections
Connections holds one C node per link, with a kind, the
child’s id and the parent’s id, and for links to a property, the property’s name:
| Kind | Meaning | Example |
|---|---|---|
"OO" | object to object: a model to its parent (0 for the root), a geometry or material to its model, a curve node to its layer | C: "OO",152171968,0 |
"OP" | object to a property of another: a texture to a material’s DiffuseColor, a curve node to a model’s Lcl Translation, a curve to d|X | C: "OP",152102088,987654321, "Lcl Translation" |
"PO" | property to object; seen in a few files | |
"PP" | property to property; presumed, not seen in the files examined |
FBX 7 files written by the FBX SDK put a comment line before each connection naming
the two objects. In FBX 6 files the node is Connect and objects are named
by their Class::Name strings, as in
Connect: "OO", "Model::Cube", "Model::Scene".
Animation
Time values (KTime) are signed 64-bit counts of
1/46,186,158,000 of a second. An AnimationStack holds layers; each
AnimationLayer holds curve nodes; an AnimationCurveNode has a
compound property d with one member per channel (d|X,
d|Y, d|Z), connected by "OP" to the property it
animates; and an AnimationCurve connects to one channel. Its children:
| Child | Contents |
|---|---|
Default | the value when there are no keys |
KeyVer | 4008 in the files seen |
KeyTime | the time of each key, in KTime (64-bit integers) |
KeyValueFloat | the value of each key |
KeyAttrFlags | one set of flags per run of keys that share them (below) |
KeyAttrDataFloat | four values per flag set: slopes or TCB values, then weight and velocity data, in a packed form that is not publicly described |
KeyAttrRefCount | how many consecutive keys use each flag set |
The flags are the FBX SDK’s FbxAnimCurveDef values, combined:
| Value | Name | Meaning |
|---|---|---|
| 0x00000002 | eInterpolationConstant | hold the value until the next key |
| 0x00000004 | eInterpolationLinear | straight line to the next key |
| 0x00000008 | eInterpolationCubic | cubic curve to the next key |
| 0x00000100 | eTangentAuto or eConstantNext | cubic keys: automatic (cardinal spline) tangents; constant keys: take the next key’s value |
| 0x00000200 | eTangentTCB | tension, continuity and bias |
| 0x00000400 | eTangentUser | user slopes, the next left slope equal to the right |
| 0x00000800 | eTangentGenericBreak | independent left and right slopes (with 0x400: eTangentBreak; with 0x100: eTangentAutoBreak) |
| 0x00001000 | eTangentGenericClamp | flat when a neighbouring key has the same value |
| 0x00002000 | eTangentGenericTimeIndependent | time-independent tangent (with 0x4000: eTangentGenericClampProgressive, value 0x6000) |
| 0x00100000 | eTangentShowLeft | left tangent visible in editors |
| 0x00200000 | eTangentShowRight | right tangent visible in editors |
| 0x01000000 | eWeightedRight | right tangent weighted |
| 0x02000000 | eWeightedNextLeft | next key’s left tangent weighted |
| 0x10000000 | eVelocityRight | right tangent has velocity |
| 0x20000000 | eVelocityNextLeft | next key’s left tangent has velocity |