KFbxXMatrix GetGlobalPosition(KFbxNode* pNode, const KTime& pTime, KFbxPose* pPose, KFbxXMatrix* pParentGlobalPosition) { KFbxXMatrix lGlobalPosition; bool lPositionFound = false; if (pPose) { int lNodeIndex = pPose->Find(pNode); if (lNodeIndex > -1) { // The bind pose is always a global matrix. // If we have a rest pose, we need to check if it is // stored in global or local space. if (pPose->IsBindPose() || !pPose->IsLocalMatrix(lNodeIndex)) { lGlobalPosition = GetPoseMatrix(pPose, lNodeIndex); } else { // We have a local matrix, we need to convert it to // a global space matrix. KFbxXMatrix lParentGlobalPosition; if (pParentGlobalPosition) { lParentGlobalPosition = *pParentGlobalPosition; } else { if (pNode->GetParent()) { lParentGlobalPosition = GetGlobalPosition(pNode->GetParent(), pTime, pPose, NULL); } } KFbxXMatrix lLocalPosition = GetPoseMatrix(pPose, lNodeIndex); lGlobalPosition = lParentGlobalPosition * lLocalPosition; } lPositionFound = true; } } if (!lPositionFound) { // There is no pose entry for that node, get the current global position instead. // Ideally this would use parent global position and local position to compute the global position. // Unfortunately the equation // lGlobalPosition = pParentGlobalPosition * lLocalPosition // does not hold when inheritance type is other than "Parent" (RSrs). // To compute the parent rotation and scaling is tricky in the RrSs and Rrs cases. lGlobalPosition = pNode->EvaluateGlobalTransform(pTime); } return lGlobalPosition; }
FbxAMatrix GetGlobalPosition(FbxNode* pNode , FbxPose* pPose, FbxAMatrix* pParentGlobalPosition) { FbxAMatrix lGlobalPosition; bool lPositionFound = false; if (pPose) { int lNodeIndex = pPose->Find(pNode); if (lNodeIndex > -1) { // The bind pose is always a global matrix. // If we have a rest pose, we need to check if it is // stored in global or local space. if (pPose->IsBindPose() || !pPose->IsLocalMatrix(lNodeIndex)) { lGlobalPosition = GetPoseMatrix(pPose, lNodeIndex); } else { // We have a local matrix, we need to convert it to // a global space matrix. FbxAMatrix lParentGlobalPosition; if (pParentGlobalPosition) { lParentGlobalPosition = *pParentGlobalPosition; } else { if (pNode->GetParent()) { lParentGlobalPosition = GetGlobalPosition(pNode->GetParent(), pPose,nullptr); } } FbxAMatrix lLocalPosition = GetPoseMatrix(pPose, lNodeIndex); lGlobalPosition = lParentGlobalPosition * lLocalPosition; } lPositionFound = true; } } return lGlobalPosition; }
KFbxXMatrix GetPoseMatrix(KFbxNode* pNode,KFbxPose* pPose) { int lNodeIndex = pPose->Find(pNode); return GetPoseMatrix( pPose , lNodeIndex ); }