// skinning private void CreateMeshSkinning(Dictionary <string, List <VertexWeight> > vg, FBXNode pFbxMesh, FBXNode pSkeletonRoot, FBXScene pScene) { FBXSkin lFbxSkin = FBXSkin.Create(pScene, ""); FBXAMatrix lMeshMatTransform = pFbxMesh.EvaluateGlobalTransform(); foreach (string key in vg.Keys) { List <VertexWeight> bvg = vg[key]; FBXCluster lCluster = FBXCluster.Create(pScene, key); FBXNode lFbxBone = pSkeletonRoot.FindChild(key); if (lFbxBone != null) { lCluster.SetLink(lFbxBone); foreach (VertexWeight v in bvg) { lCluster.AddControlPointIndex(v.vertexIndex, v.weight); } lFbxSkin.AddCluster(lCluster); lCluster.SetTransformMatrix(lMeshMatTransform); FBXAMatrix lBoneMatTransform = lFbxBone.EvaluateGlobalTransform(); lCluster.SetTransformLinkMatrix(lBoneMatTransform); } } FBXGeometry lFbxMeshAtt = (FBXGeometry)pFbxMesh.GetNodeAttribute().ToGeometry(); if (lFbxMeshAtt != null) { lFbxMeshAtt.AddDeformer(lFbxSkin); } }
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); }
private void UpdateSkeletonWithMorph(Unreal.BioMorphFace morph, FBXNode pSkeletonNode) { foreach (var bo in morph.BonesOffset) { FBXNode fbxBone = pSkeletonNode.FindChild(bo.BoneName); List <double> tmp = fbxBone.LclTranslation; tmp[0] = bo.Offset.X; tmp[1] = -bo.Offset.Y; tmp[2] = bo.Offset.Z; fbxBone.LclTranslation = tmp; } }
private void UpdateSkeletonWithMorph(SkeletonAsset Skeleton, FBXNode pSkeletonNode, List <Vector> morphBones) { for (int i = 0; i < Skeleton.Bones.Count; i++) { FBBone fbbone = Skeleton.Bones[i]; FBXNode fbxBone = pSkeletonNode.FindChild(fbbone.Name); Vector boneOffset = morphBones[i]; List <double> tmp = fbxBone.LclTranslation; tmp[0] += boneOffset.members[0] * exportScale; tmp[1] += boneOffset.members[1] * exportScale; tmp[2] += boneOffset.members[2] * exportScale; fbxBone.LclTranslation = tmp; } }
private void SetBoneTransform(SkeletonAsset Skeleton, FBXNode pSkeletonRoot) { Dictionary <String, FBBone> pose = Skeleton.ModelBones; foreach (string key in pose.Keys) { FBBone bonePose = pose[key]; FBXNode fbxBone = pSkeletonRoot.FindChild(key); FBXVector4 ForwardM = new FBXVector4(bonePose.Forward.members[0], bonePose.Forward.members[1], bonePose.Forward.members[2], 0); FBXVector4 RightM = new FBXVector4(bonePose.Right.members[0], bonePose.Right.members[1], bonePose.Right.members[2], 0); FBXVector4 UpM = new FBXVector4(bonePose.Up.members[0], bonePose.Up.members[1], bonePose.Up.members[2], 0); FBXVector4 TransM = new FBXVector4(bonePose.Location.members[0] * exportScale, bonePose.Location.members[1] * exportScale, bonePose.Location.members[2] * exportScale, 1); FBXAMatrix transfoMatrix = new FBXAMatrix(); transfoMatrix.SetRow(0, RightM); transfoMatrix.SetRow(1, UpM); transfoMatrix.SetRow(2, ForwardM); transfoMatrix.SetRow(3, TransM); FBXHelper.SetGlobalDefaultPosition(fbxBone, transfoMatrix); } }