/** * Add the given skeletal mesh to the Fbx scene in preparation for exporting. Makes all new nodes a child of the given node */ FbxNode* FFbxExporter::ExportSkeletalMeshToFbx(const USkeletalMesh* SkelMesh, const UAnimSequence* AnimSeq, const TCHAR* MeshName, FbxNode* ActorRootNode) { if(AnimSeq) { return ExportAnimSequence(AnimSeq, SkelMesh, true, MeshName, ActorRootNode); } else { TArray<FbxNode*> BoneNodes; // Add the skeleton to the scene FbxNode* SkeletonRootNode = CreateSkeleton(SkelMesh, BoneNodes); if(SkeletonRootNode) { ActorRootNode->AddChild(SkeletonRootNode); } // Add the mesh FbxNode* MeshRootNode = CreateMesh(SkelMesh, MeshName); if(MeshRootNode) { ActorRootNode->AddChild(MeshRootNode); } if(SkeletonRootNode && MeshRootNode) { // Bind the mesh to the skeleton BindMeshToSkeleton(SkelMesh, MeshRootNode, BoneNodes); // Add the bind pose CreateBindPose(MeshRootNode); } return SkeletonRootNode; } return NULL; }
FbxNode* FFbxExporter::ExportAnimSequence( const UAnimSequence* AnimSeq, const USkeletalMesh* SkelMesh, bool bExportSkelMesh, const TCHAR* MeshName, FbxNode* ActorRootNode ) { if( Scene == NULL || AnimSeq == NULL || SkelMesh == NULL ) { return NULL; } FbxNode* RootNode = (ActorRootNode)? ActorRootNode : Scene->GetRootNode(); // Create the Skeleton TArray<FbxNode*> BoneNodes; FbxNode* SkeletonRootNode = CreateSkeleton(SkelMesh, BoneNodes); RootNode->AddChild(SkeletonRootNode); // Export the anim sequence { ExportAnimSequenceToFbx(AnimSeq, SkelMesh, BoneNodes, AnimLayer, 0.f, // AnimStartOffset 0.f, // AnimEndOffset 1.f, // AnimPlayRate 0.f); // StartTime CorrectAnimTrackInterpolation(BoneNodes, AnimLayer); } // Optionally export the mesh if(bExportSkelMesh) { FString MeshNodeName; if (MeshName) { MeshNodeName = MeshName; } else { SkelMesh->GetName(MeshNodeName); } // Add the mesh FbxNode* MeshRootNode = CreateMesh(SkelMesh, *MeshNodeName); if(MeshRootNode) { RootNode->AddChild(MeshRootNode); } if(SkeletonRootNode && MeshRootNode) { // Bind the mesh to the skeleton BindMeshToSkeleton(SkelMesh, MeshRootNode, BoneNodes); // Add the bind pose CreateBindPose(MeshRootNode); } } return SkeletonRootNode; }