The node records 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. 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. Names of nodes and property values are exactly as they appear in files.
Top-level nodes
| Node | Holds |
|---|---|
FBXHeaderExtension | the file header: versions, creation time, the program that wrote it, scene information |
FileId | 16 raw bytes, apparently derived from the creation time |
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 same version as the file header, such as 7400 |
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 | an object named GlobalInfo of class SceneInfo and type 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), 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 empty |
| 4 | flags, letters | empty, 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 and an empty label.
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 name and
class joined (see Object names),
and a subclass. Id 0 is the scene root.
| 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 | empty | a surface material: Version 102, ShadingModel (phong or lambert), MultiLayer, colour and factor properties |
Texture | empty | 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 |
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 | empty | an animation clip (take) |
AnimationLayer | empty | a layer of a stack |
AnimationCurveNode | empty | joins curves to an animated property |
AnimationCurve | empty | one animated channel: keys and values |
Meshes
A Geometry of subclass Mesh has GeometryVersion
(124 in the files seen) and these arrays:
| Child | Type | Contents |
|---|---|---|
Vertices | double array | x, y, z of each control point |
PolygonVertexIndex | int array | 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 | int array | 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 | "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 | "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 |
In FBX 6 files the node is Connect and objects are named by their
Class::Name strings instead of ids.
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 | Type | Contents |
|---|---|---|
Default | double | the value when there are no keys |
KeyVer | integer | 4008 in the files seen |
KeyTime | int64 array | the time of each key, in KTime |
KeyValueFloat | float array | the value of each key |
KeyAttrFlags | int array | one set of flags per run of keys that share them (below) |
KeyAttrDataFloat | float array | four values per flag set: slopes or TCB values, then weight and velocity data, in a packed form that is not publicly described |
KeyAttrRefCount | int array | 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 |