void ReadMeshGeometriesRecursive(FbxManager manager, FbxNode node, ImportOptions options, Matrix4 additionalTransform /*nodeTransform*/) { FbxExtensions.GetNodeMesh(node, out FbxMesh fbxMesh); if (fbxMesh != null) { var res = ProcessMesh.ProcMesh(manager, node, fbxMesh, options, additionalTransform); if (res != null) { foreach (var geom in res) { geom.Name = ImportGeneral.GetFixedName(geom.Node.GetName()); if (Skeleton != null) { FillBoneAssignments(geom, Skeleton); } Geometries.Add(geom); } } } for (int i = 0; i < node.GetChildCount(); i++) { var childNode = node.GetChild(i); ReadMeshGeometriesRecursive(manager, childNode, options, additionalTransform); } }
public AnimationTrackInfo(FbxAnimStack pAnimStack, FbxNode pRootNode) { Name = pAnimStack.GetName(); //Duration = GetAnimationMaxTime(pRootNode, pAnimStack); int animLayersNum = FbxExtensions.GetAnimLayerCount(pAnimStack); mLayers = new List <FbxAnimLayer>(); for (int j = 0; j < animLayersNum; j++) { FbxAnimLayer pAnimLayer = FbxExtensions.GetAnimLayer(pAnimStack, j); mLayers.Add(pAnimLayer); } }
//void EnumerateNodeRecursive(FbxNode pNode) //{ // FbxMesh pMesh; // if (IsNodeMesh(pNode, out pMesh)) // { // CreateMaterialsFromNode(pNode); // CreateMeshesFromNode(pNode, pMesh); // } // for (int j = 0; j < pNode.GetChildCount(); j++) // EnumerateNodeRecursive(pNode.GetChild(j)); //} void LoadAnimations(FbxScene scene) { FbxTime.EMode timeMode = scene.GetGlobalSettings().GetTimeMode(); FrameRate = FbxTime.GetFrameRate(timeMode); int animationCount = FbxExtensions.GetAnimStackCount(scene); AnimationTracks = new List <AnimationTrackInfo>(); for (int i = 0; i < animationCount; i++) { FbxAnimStack pAnimStack = FbxExtensions.GetAnimStack(scene, i); AnimationTrackInfo pAnimationTrack = new AnimationTrackInfo(pAnimStack, scene.GetRootNode()); AnimationTracks.Add(pAnimationTrack); } }
public SkeletonBone(FbxNode boneNode, SkeletonBone parentBone, FbxSkin[] skins, SceneLoader scene) { //this.scene = scene; this.scene = scene; Node = boneNode; ParentBone = parentBone; //animationTrackKeyFrames = new List<HashSet<double>>(); cluster = Skeleton.FindCluster(Node, skins, out skin); //Поиск по всем skins во всех mesh. Можно было бы сделать эффективнее. globalMeshTransform = new FbxAMatrix(); globalMeshTransform.SetIdentity(); geometryOffset = new FbxAMatrix(); geometryOffset.SetIdentity(); if (cluster != null) { FbxNode meshNode = skin.GetGeometry()?.GetNode(); if (meshNode != null) { globalMeshTransform = meshNode.EvaluateGlobalTransform(FbxExtensions.ToFbxTime(-1)); // FbxMath.GetGlobalPosition( meshNode, FbxExtensions.ToFbxTime( -1 ), null ); geometryOffset = FbxMath.GetGeometryOffset(meshNode); } } InitialTransform = GetInitialTransform().ToMatrix4(); //Во внешнем коде надо использовать это значение, т.к. результат GetInitialTransform() может зависеть от установленного AnimationTrack }