Translation, Rotation and Scaling Vectors
The default translation, rotation, and scaling (default TRS properties) of a node are accessed using the KFbxNode::LclTranslation, KFbxNode::LclRotation, and KFbxNode::LclScaling properties:
// Get the node’s default TRS properties fbxDouble3 lTranslation = lNode->LclTranslation.Get(); fbxDouble3 lRotation = lNode->LclRotation.Get(); fbxDouble3 lScaling = lNode->LclScaling.Get();
The KFbxTypedPropertyAll three member functions return vectors of type fbxDouble3. The value of each vector is a triplet of X, Y, and Z coordinates. The value of one of these vectors is an offset from the corresponding default TRS property vector for the parent node. A node’s default TRS properties are therefore local to the parent node.
The actual TRS properties for the node at a given point in time depend on:
Global and Local Transformation Matrices
A node's global and local tranformation matrices can be respectively obtained by calling KFbxNode::EvaluateGlobalTransform() and KFbxNode::EvaluateLocalTransform():
// Get the node's default global transformation matrix. KFbxXMatrix& lGlobalTransform = lNode->EvaluateGlobalTransform(); // Get the node's default local transformation matrix. KFbxXMatrix& lLocalTransform = lNode->EvaluateLocalTransform();
These member functions are equivalent to using the KFbxScene's animation evaluator KFbxAnimEvaluator::GetNodeGlobalTransform() and KFbxAnimEvaluator::GetNodeLocalTransform() functions:
// Get the scene's animation evaluator. KFbxAnimEvaluator* lEvaluator = lScene->getEvaluator(); // Get the node's default global transformation matrix. KFbxXMatrix& lGlobalTransform = lEvaluator->GetNodeGlobalTransform(lNode); // Get the node's default local transformation matrix. KFbxXMatrix& lLocalTransform = lEvaluator->GetNodeLocalTransform(lNode);
An animated node's transformation matrix can be obtained for a specific point in time by passing a KTime object.
KTime lTime; // Set the time at two seconds. lTime.SetSecondDouble((float) 2); // Get the node's global transformation matrix at 2 seconds. KFbxXMatrix& lGlobalTransform = lNode->EvaluateGlobalTransform(lTime);
Baking Transform Components Into the Standard TRS Transforms
The KFbxNode::ConvertPivotAnimationRecursive() function lets you bake transform components: pre- and post-rotation, rotation and scale pivots and offsets - inside the standard transforms - Translation, Rotation, Scaling. Here is a code snippet.
// Do this setup for each node (KFbxNode).
// We set up what we want to bake via ConvertPivotAnimationRecursive.
// When the destination is set to 0, baking will occur.
// When the destination value is set to the source’s value, the source values will be retained and not baked.
{
KFbxVector4 lZero(0,0,0);
// Activate pivot converting
pNode->SetPivotState(KFbxNode::eSOURCE_SET, KFbxNode::ePIVOT_STATE_ACTIVE);
pNode->SetPivotState(KFbxNode::eDESTINATION_SET, KFbxNode::ePIVOT_STATE_ACTIVE);
// We want to set all these to 0 and bake them into the transforms.
pNode->SetPostRotation(KFbxNode::eDESTINATION_SET, lZero);
pNode->SetPreRotation(KFbxNode::eDESTINATION_SET, lZero);
pNode->SetRotationOffset(KFbxNode::eDESTINATION_SET, lZero);
pNode->SetScalingOffset(KFbxNode::eDESTINATION_SET, lZero);
pNode->SetRotationPivot(KFbxNode::eDESTINATION_SET, lZero);
pNode->SetScalingPivot(KFbxNode::eDESTINATION_SET, lZero);
// This is to import in a system that supports rotation order.
// If rotation order is not supported, do this instead:
// pNode->SetRotationOrder(KFbxNode::eDESTINATION_SET , KFbxNode::eEULER_XYZ);
ERotationOrder lRotationOrder;
pNode->GetRotationOrder(KFbxNode::eSOURCE_SET , lRotationOrder);
pNode->SetRotationOrder(KFbxNode::eDESTINATION_SET , lRotationOrder);
// Similarly, this is the case where geometric transforms are supported by the system.
// If geometric transforms are not supported, set them to zero instead of
// the source’s geometric transforms.
// Geometric transform = local transform, not inherited by children.
pNode->SetGeometricTranslation(KFbxNode::eDESTINATION_SET, pNode->GetGeometricTranslation(KFbxNode::eSOURCE_SET));
pNode->SetGeometricRotation(KFbxNode::eDESTINATION_SET, pNode->GetGeometricRotation(KFbxNode::eSOURCE_SET));
pNode->SetGeometricScaling(KFbxNode::eDESTINATION_SET, pNode->GetGeometricScaling(KFbxNode::eSOURCE_SET));
// Idem for quaternions.
pNode->SetUseQuaternionForInterpolation(KFbxNode::eDESTINATION_SET, pNode->GetUseQuaternionForInterpolation(KFbxNode::eSOURCE_SET));
}
// When the setup is done, call ConvertPivotAnimationRecursive to the scene’s root node.
// Sampling rate e.g. 30.0.
mScene->GetRootNode()->ConvertPivotAnimationRecursive(KFbxNode::eDESTINATION_SET, lSamplingRate );