FBX Node Attributes

Creating a Node Attribute

A FbxNodeAttribute is paired with a FbxNode to define a scene element with a specific position, rotation and scale. Calling FbxNode::GetNodeAttribute() will return NULL if no node attribute was set for that node.

The following code sample (adapted from ExportScene04/main.cxx to fit the diagram above) illustrates how to create a simple spotlight within a scene. Here, FbxLight* light is the node attribute of FbxNode* lightNode. For more information on lights, see Lights.

// Create a spotlight. 
FbxNode* CreateLight(FbxScene* pScene, char* pName)
{
    FbxLight* light = FbxLight::Create(pScene,pName);

    light->LightType.Set(FbxLight::eSpot);
    light->CastLight.Set(true);

    FbxNode* lightNode = FbxNode::Create(pScene,pName);

    lightNode->SetNodeAttribute(light);

    return lightNode;
}

Node Attributes

The following table presents a set of basic scene elements and their related FbxNodeAttribute subclasses. These node attributes can be paired with a FbxNode using FbxNode::SetNodeAttribute(). Consult the C++ Reference guide for the full class hierarchy.

Scene Element FbxNodeAttribute subclass
Camera FbxCamera, FbxCameraStereo
Camera Switcher (custom camera definition in Autodesk MotionBuilder) FbxCameraSwitcher
Light FbxLight
Mesh FbxMesh
Nurb FbxNurbs, FbxNurbsCurve, FbxNurbsSurface, FbxTrimNurbsSurface
Patch / Parametric Surface FbxPatch
Level of Detail Group FbxLodGroup
Marker FbxMarker
Skeleton FbxSkeleton

NOTE:Some applications require a null node type in their scene graph. The FbxNull node attribute is used to define such a node type. Observe that an instance of FbxNull is not the same as the NULL value.

Node Attribute Type

The type (FbxNodeAttribute::EAttributeType) of a FbxNodeAttribute can be obtained by calling FbxNodeAttribute::GetAttributeType(). The EAttributeType is useful for downcasting the node attribute object to its appropriate subclass.

The following code sample (adapted from ImportScene/main.cxx and ImportScene/DisplayLight.cxx) illustrates how to use a switch to display a FbxLight contained in a FbxNode.

//
// Adapted from ImportScene/DisplayLight.cxx ...
// Display the various properties of the FbxLight contained within the FbxNode.
//
void DisplayLight(FbxNode* pNode)
{
    FbxLight* lLight = (FbxLight*) pNode->GetNodeAttribute();

    DisplayString("Light Name: ", (char *) pNode->GetName());
    // ...

    char* lLightTypes[] = { "Point", "Directional", "Spot" };

    DisplayString("    Type: ", lLightTypes[lLight->LightType.Get()]);
    DisplayBool("    Cast Light: ", lLight->CastLight.Get());

    if (!(lLight->FileName.Get().IsEmpty()))
    {
        DisplayString("    Gobo");

        DisplayString("        File Name: \"", lLight->FileName.Get().Buffer(), "\"");
        DisplayBool("        Ground Projection: ", lLight->DrawGroundProjection.Get());
        DisplayBool("        Volumetric Projection: ", lLight->DrawVolumetricLight.Get());
        DisplayBool("        Front Volumetric Projection: ", lLight->DrawFrontFacingVolumetricLight.Get());
    }

    // ...
}

//
// Adapted from ImportScene/main.cxx ...
// Display the contents of a node. Here, we are only interested in
// looking  at the eLight attribute type, which coincides with the 
// FbxLight node attribute.
//
void DisplayContent(FbxNode* pNode)
{
    FbxNodeAttribute::EAttributeType lAttributeType;
    int i;

    if(pNode->GetNodeAttribute() == NULL)
    {
        printf("NULL Node Attribute\n\n");
    }
    else
    {
        lAttributeType = (pNode->GetNodeAttribute()->GetAttributeType());

        switch (lAttributeType)
        {
            // ...

        case FbxNodeAttribute::eLight:     
            DisplayLight(pNode);
            break;

            // ...
        }
    }

    // ...

    for(i = 0; i < pNode->GetChildCount(); i++)
    {
        DisplayContent(pNode->GetChild(i));
    }
}