示例#1
0
        private void StoreRestPose(FBXScene pScene, FBXNode pSkeletonRoot, SkeletonAsset Skeleton)
        {
            Dictionary <String, FBBone> pose = Skeleton.ModelBones;
            FBXAMatrix lTransformMatrix = new FBXAMatrix();
            FBXVector4 lT, lR, lS;

            lS = new FBXVector4(1.0, 1.0, 1.0, 0);
            FBXPose lPose = FBXPose.Create(pScene, "A Bind Pose");

            lT = new FBXVector4();
            lR = new FBXVector4();
            lTransformMatrix.SetTRS(lT, lR, lS);
            FBXNode lKFbxNode = pSkeletonRoot;

            lPose.Add(lKFbxNode, lTransformMatrix);
            foreach (string key in pose.Keys)
            {
                FBBone     bonePose      = pose[key];
                FBXNode    fbxBone       = pSkeletonRoot.FindChild(key);
                FBXVector4 Forward       = new FBXVector4(bonePose.Forward.members[0], bonePose.Forward.members[1], bonePose.Forward.members[2], 0);
                FBXVector4 Right         = new FBXVector4(bonePose.Right.members[0], bonePose.Right.members[1], bonePose.Right.members[2], 0);
                FBXVector4 Up            = new FBXVector4(bonePose.Up.members[0], bonePose.Up.members[1], bonePose.Up.members[2], 0);
                FBXVector4 Trans         = new FBXVector4(bonePose.Location.members[0] * exportScale, bonePose.Location.members[1] * exportScale, bonePose.Location.members[2] * exportScale, 1);
                FBXAMatrix boneTransform = new FBXAMatrix();
                boneTransform.SetRow(0, Right);
                boneTransform.SetRow(1, Up);
                boneTransform.SetRow(2, Forward);
                boneTransform.SetRow(3, Trans);
                lPose.Add(fbxBone, boneTransform);
            }
            lPose.SetIsBindPose(true);
            pScene.AddPose(lPose);
        }
示例#2
0
        private void StoreBindPose(FBXScene pScene, FBXNode pMesh)
        {
            List <FBXNode>   lClusteredFbxNodes = new List <FBXNode>();
            int              i, j;
            FBXNodeAttribute att = pMesh.GetNodeAttribute();

            if (pMesh != null && att != null)
            {
                int lSkinCount    = 0;
                int lClusterCount = 0;
                switch (pMesh.GetNodeAttribute().GetAttributeType())
                {
                default:
                    break;

                case NodeAttribType.eMesh:
                case NodeAttribType.eNurbs:
                case NodeAttribType.ePatch:
                    FBXGeometry geo = (FBXGeometry)att.ToGeometry();
                    lSkinCount = geo.GetDeformerCount(EDeformerType.eSkin);
                    for (i = 0; i < lSkinCount; ++i)
                    {
                        FBXSkin lSkin = geo.GetSkinDeformer(i);
                        lClusterCount += lSkin.GetClusterCount();
                    }
                    break;
                }
                if (lClusterCount != 0)
                {
                    for (i = 0; i < lSkinCount; ++i)
                    {
                        FBXGeometry geo   = (FBXGeometry)att.ToGeometry();
                        FBXSkin     lSkin = geo.GetSkinDeformer(i);
                        lClusterCount = lSkin.GetClusterCount();
                        for (j = 0; j < lClusterCount; ++j)
                        {
                            FBXNode lClusterNode = lSkin.GetClusterLink(j);
                            AddNodeRecursively(lClusteredFbxNodes, lClusterNode);
                        }
                    }
                    lClusteredFbxNodes.Add(pMesh);
                }
            }
            if (lClusteredFbxNodes.Count != 0)
            {
                FBXPose lPose = FBXPose.Create(pScene, "pose");
                lPose.SetIsBindPose(true);
                for (i = 0; i < lClusteredFbxNodes.Count; i++)
                {
                    FBXNode    lKFbxNode   = lClusteredFbxNodes[i];
                    FBXAMatrix lBindMatrix = lKFbxNode.EvaluateGlobalTransform();
                    lPose.Add(lKFbxNode, lBindMatrix);
                }
                pScene.AddPose(lPose);
            }
        }