示例#1
0
        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);
            }
        }
示例#3
0
        //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);
            }
        }
示例#4
0
        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
        }