Advertisement
Guest User

Untitled

a guest
May 31st, 2017
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 23.70 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using FBXWrapper;
  4.  
  5. namespace PluginSystem
  6. {
  7.     public class FBXExporter
  8.     {
  9.         public bool ExportStaticMeshToFBX(MeshAsset mesh, int lodIndex, String targetdir, bool asOne)
  10.         {
  11.             FBXManager lSdkManager = null;
  12.             FBXScene lScene = null;
  13.             FBXHelper.InitializeSdkObjects(lSdkManager, lScene);
  14.             FBXNode SceneRoot = lScene.GetRootNode();
  15.             if (asOne)
  16.             {
  17.                 FBXNode fbxMesh = CreateFbxMesh(mesh.lods[lodIndex], lScene);
  18.                 SceneRoot.AddChild(fbxMesh);
  19.             }
  20.             else
  21.             {
  22.                 for (int i = 0; i < mesh.lods[lodIndex].sections.Count; i++)
  23.                 {
  24.                     FBXNode CurrentSectionMesh = CreateFbxMesh(mesh.lods[lodIndex].sections[i], lScene);
  25.                     SceneRoot.AddChild(CurrentSectionMesh);
  26.                 }
  27.             }
  28.             return SaveScene(targetdir, lSdkManager, lScene);
  29.         }
  30.  
  31.         public bool ExportSkinnedMeshToFBX(SkeletonAsset skeleton, MeshAsset mesh, int lodIndex, String targetdir)
  32.         {
  33.             return ExportSkinnedMeshToFBX(skeleton, mesh, lodIndex, targetdir, false);
  34.         }
  35.  
  36.         public bool ExportSkinnedMeshToFBX(SkeletonAsset skeleton, MeshAsset mesh, int lodIndex, String targetdir, bool asOne)
  37.         {
  38.             FBXManager lSdkManager = null;
  39.             FBXScene lScene = null;
  40.             FBXHelper.InitializeSdkObjects(lSdkManager, lScene);
  41.             FBXNode SceneRoot = lScene.GetRootNode();
  42.             FBXNode lSkeletonRoot = CreateFbxSkeleton(skeleton, lScene);
  43.             SceneRoot.AddChild(lSkeletonRoot);
  44.             if (asOne)
  45.             {
  46.                 FBXNode fbxMesh = CreateFbxMesh(mesh.lods[lodIndex], lScene);
  47.                 CreateMeshSkinning(skeleton, mesh.lods[lodIndex], fbxMesh, lSkeletonRoot, lScene);
  48.                 SceneRoot.AddChild(fbxMesh);
  49.                 StoreRestPose(lScene, lSkeletonRoot, skeleton);
  50.             }
  51.             else
  52.             {
  53.                 for (int i = 0; i < mesh.lods[lodIndex].sections.Count; i++)
  54.                 {
  55.                     FBXNode CurrentSectionMesh = CreateFbxMesh(mesh.lods[lodIndex].sections[i], lScene);
  56.                     CreateMeshSkinning(skeleton, mesh.lods[lodIndex].sections[i], CurrentSectionMesh, lSkeletonRoot, lScene);
  57.                     SceneRoot.AddChild(CurrentSectionMesh);
  58.                     StoreBindPose(lScene, CurrentSectionMesh);
  59.                 }
  60.             }
  61.             return SaveScene(targetdir, lSdkManager, lScene);
  62.         }
  63.  
  64.         public bool ExportMeshWithMorph(SkeletonAsset Skeleton, MeshAsset mesh, int lodIndex, List<Vector> morphVertex, List<Vector> morphBones, String targetdir)
  65.         {
  66.             FBXManager lSdkManager = null;
  67.             FBXScene lScene = null;
  68.             FBXHelper.InitializeSdkObjects(lSdkManager, lScene);
  69.             FBXNode SceneRoot = lScene.GetRootNode();
  70.             FBXNode fbxMesh = CreateFbxMesh(mesh.lods[lodIndex], lScene);
  71.             AddMorphToMesh(lScene, fbxMesh, morphVertex);
  72.             SceneRoot.AddChild(fbxMesh);
  73.             if (Skeleton != null)
  74.             {
  75.                 FBXNode lSkeletonRoot = CreateFbxSkeleton(Skeleton, lScene);
  76.                 CreateMeshSkinning(Skeleton, mesh.lods[lodIndex], fbxMesh, lSkeletonRoot, lScene);
  77.                 UpdateSkeletonWithMorph(Skeleton, lSkeletonRoot, morphBones);
  78.                 SceneRoot.AddChild(lSkeletonRoot);
  79.                 StoreBindPose(lScene, fbxMesh);
  80.             }
  81.             return SaveScene(targetdir, lSdkManager, lScene);
  82.         }
  83.  
  84.  
  85.         private bool SaveScene(String targetdir, FBXManager pSdkManager, FBXScene pScene)
  86.         {
  87.             bool lResult = FBXHelper.SaveScene(pSdkManager, pScene, targetdir);
  88.             FBXHelper.DestroySdkObjects(pSdkManager, lResult);
  89.             return lResult;
  90.         }
  91.  
  92.         private FBXNode CreateFbxMesh(MeshLodSection section, FBXScene pScene)
  93.         {
  94.             FBXMesh fbxMesh = FBXMesh.Create(pScene, section.matName);
  95.             FBXGeometryElementNormal lGeometryElementNormal = fbxMesh.CreateElementNormal();
  96.             lGeometryElementNormal.SetMappingMode(FBXWrapper.MappingMode.eByControlPoint);
  97.             FBXGeometryElementBinormal lGeometryElementBiNormal = fbxMesh.CreateElementBinormal();
  98.             lGeometryElementBiNormal.SetMappingMode(FBXWrapper.MappingMode.eByControlPoint);
  99.             FBXGeometryElementTangent lGeometryElementTangent = fbxMesh.CreateElementTangent();
  100.             lGeometryElementTangent.SetMappingMode(FBXWrapper.MappingMode.eByControlPoint);
  101.             fbxMesh.InitControlPoints(section.vertices.Count);
  102.             FBXGeometryElementMaterial lMaterialElement = fbxMesh.CreateElementMaterial();
  103.             lMaterialElement.SetMappingMode(FBXWrapper.MappingMode.eByPolygon);
  104.             lMaterialElement.SetReferenceMode(FBXWrapper.ReferenceMode.eIndexToDirect);
  105.             FBXGeometryElementUV lUVDiffuseElement = fbxMesh.CreateElementUV(section.matName);
  106.             lUVDiffuseElement.SetMappingMode(FBXWrapper.MappingMode.eByControlPoint);
  107.             lUVDiffuseElement.SetReferenceMode(FBXWrapper.ReferenceMode.eIndexToDirect);
  108.             lUVDiffuseElement.SetIndexArrayCount(section.vertices.Count);
  109.             for (int j = 0; j < section.vertices.Count; j++)
  110.             {
  111.                 FBXVector4 position = new FBXVector4(section.vertices[j].position.members[0], section.vertices[j].position.members[1], section.vertices[j].position.members[2], 0);
  112.                 FBXVector4 normal = new FBXVector4(section.vertices[j].normals.members[0], section.vertices[j].normals.members[1], section.vertices[j].normals.members[2], section.vertices[j].normals.members[3]);
  113.                 FBXVector4 textCoords = new FBXVector4(section.vertices[j].texCoords.members[0], (-section.vertices[j].texCoords.members[1] + 1), 0, 0);
  114.                 FBXVector4 bitangent = new FBXVector4(section.vertices[j].biTangents.members[0], section.vertices[j].biTangents.members[1], section.vertices[j].biTangents.members[2], section.vertices[j].biTangents.members[3]);
  115.                 FBXVector4 tangent = new FBXVector4(section.vertices[j].tangents.members[0], section.vertices[j].tangents.members[1], section.vertices[j].tangents.members[2], section.vertices[j].tangents.members[3]);
  116.                 fbxMesh.SetControlPoint(j, position);
  117.                 lGeometryElementNormal.Add(normal);
  118.                 lGeometryElementBiNormal.Add(bitangent);
  119.                 lGeometryElementTangent.Add(tangent);
  120.                 lUVDiffuseElement.Add(textCoords);
  121.             }
  122.  
  123.             for (int j = 0; j < section.indicies.Count; j++)
  124.             {
  125.                 if (j % 3 == 0)
  126.                 {
  127.                     fbxMesh.EndPolygon();
  128.                     fbxMesh.BeginPolygon();
  129.                 }
  130.                 fbxMesh.AddPolygon(section.indicies[j]);
  131.             }
  132.             fbxMesh.EndPolygon();
  133.             FBXNode lMeshNode = FBXNode.Create(pScene, section.matName);
  134.             lMeshNode.SetNodeAttribute(fbxMesh);
  135.             lMeshNode.AddMaterial(pScene, section.matName);
  136.             return lMeshNode;
  137.         }
  138.  
  139.         private FBXNode CreateFbxMesh(MeshLOD lod, FBXScene pScene)
  140.         {
  141.             FBXMesh fbxMesh = FBXMesh.Create(pScene, lod.shortName);
  142.             FBXNode lMeshNode = FBXNode.Create(pScene, lod.shortName);
  143.             lMeshNode.SetNodeAttribute(fbxMesh);
  144.             FBXGeometryElementNormal lGeometryElementNormal = fbxMesh.CreateElementNormal();
  145.             lGeometryElementNormal.SetMappingMode(FBXWrapper.MappingMode.eByControlPoint);
  146.             FBXGeometryElementBinormal lGeometryElementBiNormal = fbxMesh.CreateElementBinormal();
  147.             lGeometryElementBiNormal.SetMappingMode(FBXWrapper.MappingMode.eByControlPoint);
  148.             FBXGeometryElementTangent lGeometryElementTangent = fbxMesh.CreateElementTangent();
  149.             lGeometryElementTangent.SetMappingMode(FBXWrapper.MappingMode.eByControlPoint);
  150.             FBXGeometryElementMaterial lMaterialElement = fbxMesh.CreateElementMaterial();
  151.             lMaterialElement.SetMappingMode(FBXWrapper.MappingMode.eByPolygon);
  152.             lMaterialElement.SetReferenceMode(FBXWrapper.ReferenceMode.eIndexToDirect);
  153.             int verticesCount = lod.GetLODTotalVertCount();
  154.             fbxMesh.InitControlPoints(verticesCount);
  155.             List<FBXGeometryElementUV> UVs = new List<FBXGeometryElementUV>();
  156.             for (int i = 0; i < lod.sections.Count; i++)
  157.             {
  158.                 MeshLodSection section = lod.sections[i];
  159.                 FBXGeometryElementUV lUVDiffuseElement = fbxMesh.CreateElementUV(section.matName);
  160.                 lUVDiffuseElement.SetMappingMode(FBXWrapper.MappingMode.eByControlPoint);
  161.                 lUVDiffuseElement.SetReferenceMode(FBXWrapper.ReferenceMode.eDirect);
  162.                 UVs.Add(lUVDiffuseElement);
  163.             }
  164.             int VertexOffset = 0;
  165.             for (int i = 0; i < lod.sections.Count; i++)
  166.             {
  167.                 MeshLodSection section = lod.sections[i];
  168.                 for (int j = 0; j < section.vertices.Count; j++)
  169.                 {
  170.                     FBXVector4 position = new FBXVector4(section.vertices[j].position.members[0], section.vertices[j].position.members[1], section.vertices[j].position.members[2], 0);
  171.                     FBXVector4 normal = new FBXVector4(section.vertices[j].normals.members[0], section.vertices[j].normals.members[1], section.vertices[j].normals.members[2], section.vertices[j].normals.members[3]);
  172.                     FBXVector4 textCoords = new FBXVector4(section.vertices[j].texCoords.members[0], (-section.vertices[j].texCoords.members[1] + 1), 0, 0);
  173.                     FBXVector4 bitangent = new FBXVector4(section.vertices[j].biTangents.members[0], section.vertices[j].biTangents.members[1], section.vertices[j].biTangents.members[2], section.vertices[j].biTangents.members[3]);
  174.                     FBXVector4 tangent = new FBXVector4(section.vertices[j].tangents.members[0], section.vertices[j].tangents.members[1], section.vertices[j].tangents.members[2], section.vertices[j].tangents.members[3]);
  175.                     fbxMesh.SetControlPoint(VertexOffset + j, position);
  176.                     lGeometryElementNormal.Add(normal);
  177.                     lGeometryElementBiNormal.Add(bitangent);
  178.                     lGeometryElementTangent.Add(tangent);
  179.                     int uvI = 0;
  180.                     foreach (FBXGeometryElementUV uv in UVs)
  181.                     {
  182.                         if (uvI == i)
  183.                             uv.Add(textCoords);
  184.                         else
  185.                             uv.Add(new FBXVector4(0, 0, 0, 0));
  186.                         uvI++;
  187.                     }
  188.                 }
  189.                 for (int j = 0; j < section.indicies.Count; j++)
  190.                 {
  191.                     if (j % 3 == 0)
  192.                     {
  193.                         fbxMesh.EndPolygon();
  194.                         fbxMesh.BeginPolygon(i);
  195.                     }
  196.                     fbxMesh.AddPolygon(VertexOffset + section.indicies[j]);
  197.                 }
  198.                 fbxMesh.EndPolygon();
  199.                 VertexOffset = VertexOffset + section.vertices.Count;
  200.                 lMeshNode.AddMaterial(pScene, section.matName);
  201.             }
  202.             return lMeshNode;
  203.         }
  204.  
  205.         private FBXNode CreateFbxSkeleton(SkeletonAsset Skeleton, FBXScene pScene)
  206.         {
  207.             FBXSkeleton lSkeletonRootAttribute = FBXSkeleton.Create(pScene, "Skeleton");
  208.             lSkeletonRootAttribute.SetSkeletonType(FBXWrapper.SkelType.eRoot);
  209.             FBXNode lSkeletonRoot = FBXNode.Create(pScene, "Skeleton");
  210.             lSkeletonRoot.SetNodeAttribute(lSkeletonRootAttribute);
  211.             lSkeletonRoot.LclTranslation = new FBXVector4().ToList();
  212.             FBXNode FbxSkeletonRootNode = CreateFbxBone(Skeleton.RootBone, pScene, lSkeletonRoot);
  213.             lSkeletonRoot.AddChild(FbxSkeletonRootNode);
  214.             SetBoneTransform(Skeleton, lSkeletonRoot);
  215.             return lSkeletonRoot;
  216.         }
  217.  
  218.         private FBXNode CreateFbxBone(FBBone bone, FBXScene pScene, FBXNode parent)
  219.         {
  220.             FBXSkeleton lSkeletonLimbNodeAttribute1 = FBXSkeleton.Create(pScene, bone.Name);
  221.             lSkeletonLimbNodeAttribute1.SetSkeletonType(FBXWrapper.SkelType.eLimbNode);
  222.             lSkeletonLimbNodeAttribute1.SetSize(1.0);
  223.             FBXNode lSkeletonLimbNode1 = FBXNode.Create(pScene, bone.Name);
  224.             lSkeletonLimbNode1.SetNodeAttribute(lSkeletonLimbNodeAttribute1);
  225.             for (int i = 0; i < bone.Children.Count; i++)
  226.             {
  227.                 FBBone childBone = bone.Children[i];
  228.                 FBXNode fbxChildBone = CreateFbxBone(childBone, pScene, lSkeletonLimbNode1);
  229.                 lSkeletonLimbNode1.AddChild(fbxChildBone);
  230.             }
  231.             return lSkeletonLimbNode1;
  232.         }
  233.  
  234.         private FBXVector4 CalculateBoneRotation(FBBone bone)
  235.         {
  236.             FBXAMatrix fbxrotMat = new FBXAMatrix();
  237.             FBXVector4 Forward = new FBXVector4(bone.Forward.members[0], bone.Forward.members[1], bone.Forward.members[2], 0);
  238.             FBXVector4 Right = new FBXVector4(bone.Right.members[0], bone.Right.members[1], bone.Right.members[2], 0);
  239.             FBXVector4 Up = new FBXVector4(bone.Up.members[0], bone.Up.members[1], bone.Up.members[2], 0);
  240.             fbxrotMat.SetRow(0, Right);
  241.             fbxrotMat.SetRow(1, Up);
  242.             fbxrotMat.SetRow(2, Forward);
  243.             fbxrotMat.SetRow(3, new FBXVector4(0, 0, 0, 1));
  244.             FBXVector4 boneRot = fbxrotMat.getR();
  245.             return boneRot;
  246.         }
  247.  
  248.         private void CreateMeshSkinning(SkeletonAsset Skeleton, MeshLOD lod, FBXNode pFbxMesh, FBXNode pSkeletonRoot, FBXScene pScene)
  249.         {
  250.             Dictionary<string, List<VertexGroup.VertexWeight>> vg = VertexGroup.GetVertexGroups(Skeleton, lod);
  251.             CreateMeshSkinning(vg, pFbxMesh, pSkeletonRoot, pScene);
  252.         }
  253.  
  254.         private void CreateMeshSkinning(SkeletonAsset Skeleton, MeshLodSection section, FBXNode pFbxMesh, FBXNode pSkeletonRoot, FBXScene pScene)
  255.         {
  256.             Dictionary<string, List<VertexGroup.VertexWeight>> vg = VertexGroup.GetVertexGroups(Skeleton, section);
  257.             CreateMeshSkinning(vg, pFbxMesh, pSkeletonRoot, pScene);
  258.         }
  259.  
  260.         private void CreateMeshSkinning(Dictionary<string, List<VertexGroup.VertexWeight>> vg, FBXNode pFbxMesh, FBXNode pSkeletonRoot, FBXScene pScene)
  261.         {
  262.             FBXSkin lFbxSkin = FBXSkin.Create(pScene, "");
  263.             FBXAMatrix lMeshMatTransform = pFbxMesh.EvaluateGlobalTransform();
  264.             foreach (string key in vg.Keys)
  265.             {
  266.                 List<VertexGroup.VertexWeight> bvg = vg[key];
  267.                 FBXCluster lCluster = FBXCluster.Create(pScene, key);
  268.                 FBXNode lFbxBone = pSkeletonRoot.FindChild(key);
  269.                 if (lFbxBone != null)
  270.                 {
  271.                     lCluster.SetLink(lFbxBone);
  272.                     foreach (VertexGroup.VertexWeight v in bvg)
  273.                         lCluster.AddControlPointIndex(v.VertexIndex, v.Weight);
  274.                     lFbxSkin.AddCluster(lCluster);
  275.                     lCluster.SetTransformMatrix(lMeshMatTransform);
  276.                     FBXAMatrix lBoneMatTransform = lFbxBone.EvaluateGlobalTransform();
  277.                     lCluster.SetTransformLinkMatrix(lBoneMatTransform);
  278.                 }
  279.             }
  280.  
  281.             FBXGeometry lFbxMeshAtt = (FBXGeometry)pFbxMesh.GetNodeAttribute().ToGeometry();
  282.             if (lFbxMeshAtt != null)
  283.                 lFbxMeshAtt.AddDeformer(lFbxSkin);
  284.         }
  285.  
  286.         private void UpdateSkeletonWithMorph(SkeletonAsset Skeleton, FBXNode pSkeletonNode, List<Vector> morphBones)
  287.         {
  288.             for (int i = 0; i < Skeleton.Bones.Count; i++)
  289.             {
  290.                 FBBone fbbone = Skeleton.Bones[i];
  291.                 FBXNode fbxBone = pSkeletonNode.FindChild(fbbone.Name);
  292.                 Vector boneOffset = morphBones[i];
  293.                 List<double> tmp = fbxBone.LclTranslation;
  294.                 tmp[0] += boneOffset.members[0];
  295.                 tmp[1] += boneOffset.members[1];
  296.                 tmp[2] += boneOffset.members[2];
  297.                 fbxBone.LclTranslation = tmp;
  298.             }
  299.         }
  300.  
  301.         private void StoreBindPose(FBXScene pScene, FBXNode pMesh)
  302.         {
  303.             List<FBXNode> lClusteredFbxNodes = new List<FBXNode>();
  304.             int i, j;
  305.             FBXNodeAttribute att = pMesh.GetNodeAttribute();
  306.             if (pMesh != null && att != null)
  307.             {
  308.                 int lSkinCount = 0;
  309.                 int lClusterCount = 0;
  310.                 switch (pMesh.GetNodeAttribute().GetAttributeType())
  311.                 {
  312.                     default:
  313.                         break;
  314.                     case NodeAttribType.eMesh:
  315.                     case NodeAttribType.eNurbs:
  316.                     case NodeAttribType.ePatch:
  317.                         FBXGeometry geo = (FBXGeometry)att.ToGeometry();
  318.                         lSkinCount = geo.GetDeformerCount(EDeformerType.eSkin);
  319.                         for (i = 0; i < lSkinCount; ++i)
  320.                         {
  321.                             FBXSkin lSkin = geo.GetSkinDeformer(i);
  322.                             lClusterCount += lSkin.GetClusterCount();
  323.                         }
  324.                         break;
  325.                 }
  326.                 if (lClusterCount != 0)
  327.                 {
  328.                     for (i = 0; i < lSkinCount; ++i)
  329.                     {
  330.  
  331.                         FBXGeometry geo = (FBXGeometry)att.ToGeometry();
  332.                         FBXSkin lSkin = geo.GetSkinDeformer(i);
  333.                         lClusterCount = lSkin.GetClusterCount();
  334.                         for (j = 0; j < lClusterCount; ++j)
  335.                         {
  336.                             FBXNode lClusterNode = lSkin.GetClusterLink(j);
  337.                             AddNodeRecursively(lClusteredFbxNodes, lClusterNode);
  338.                         }
  339.                     }
  340.                     lClusteredFbxNodes.Add(pMesh);
  341.                 }
  342.             }
  343.             if (lClusteredFbxNodes.Count != 0)
  344.             {
  345.                 FBXPose lPose = FBXPose.Create(pScene, "pose");
  346.                 lPose.SetIsBindPose(true);
  347.                 for (i = 0; i < lClusteredFbxNodes.Count; i++)
  348.                 {
  349.                     FBXNode lKFbxNode = lClusteredFbxNodes[i];
  350.                     FBXAMatrix lBindMatrix = lKFbxNode.EvaluateGlobalTransform();
  351.                     lPose.Add(lKFbxNode, lBindMatrix);
  352.                 }
  353.                 pScene.AddPose(lPose);
  354.             }
  355.         }
  356.  
  357.         private void StoreRestPose(FBXScene pScene, FBXNode pSkeletonRoot, SkeletonAsset Skeleton)
  358.         {
  359.             Dictionary<String, FBBone> pose = Skeleton.ModelBones;
  360.             FBXNode lKFbxNode = null;
  361.             FBXAMatrix lTransformMatrix = null;
  362.             FBXVector4 lT, lR, lS;
  363.             lS = new FBXVector4(1.0, 1.0, 1.0, 0);
  364.             FBXPose lPose = FBXPose.Create(pScene, "A Bind Pose");
  365.             lT = new FBXVector4();
  366.             lR = new FBXVector4();
  367.             lTransformMatrix.SetTRS(lT, lR, lS);
  368.             lKFbxNode = pSkeletonRoot;
  369.             lPose.Add(lKFbxNode, lTransformMatrix);
  370.             foreach (string key in pose.Keys)
  371.             {
  372.                 FBBone bonePose = pose[key];
  373.                 FBXNode fbxBone = pSkeletonRoot.FindChild(key);
  374.                 FBXVector4 Forward = new FBXVector4(bonePose.Forward.members[0],    bonePose.Forward.members[1],    bonePose.Forward.members[2],    0);
  375.                 FBXVector4 Right =   new FBXVector4(bonePose.Right.members[0],      bonePose.Right.members[1],      bonePose.Right.members[2],      0);
  376.                 FBXVector4 Up =      new FBXVector4(bonePose.Up.members[0],         bonePose.Up.members[1],         bonePose.Up.members[2],         0);
  377.                 FBXVector4 Trans =   new FBXVector4(bonePose.Location.members[0],   bonePose.Location.members[1],   bonePose.Location.members[2],   1);
  378.                 FBXAMatrix boneTransform = new FBXAMatrix();
  379.                 boneTransform.SetRow(0, Right);
  380.                 boneTransform.SetRow(1, Up);
  381.                 boneTransform.SetRow(2, Forward);
  382.                 boneTransform.SetRow(3, Trans);
  383.                 lPose.Add(fbxBone, boneTransform);
  384.             }
  385.             lPose.SetIsBindPose(true);
  386.             pScene.AddPose(lPose);
  387.         }
  388.  
  389.         private void SetBoneTransform(FBBone bone, FBXNode fbxBoneNode)
  390.         {
  391.             List<double> tmp = new List<double>();
  392.             tmp.Add(bone.Location.members[0]);
  393.             tmp.Add(bone.Location.members[1]);
  394.             tmp.Add(bone.Location.members[2]);
  395.             fbxBoneNode.LclTranslation = tmp;
  396.  
  397.             FBXVector4 rot = CalculateBoneRotation(bone);
  398.             tmp = new List<double>();
  399.             tmp.Add(rot.X);
  400.             tmp.Add(rot.Y);
  401.             tmp.Add(rot.Z);
  402.             fbxBoneNode.LclRotation = tmp;
  403.         }
  404.  
  405.         private void SetBoneTransform(SkeletonAsset Skeleton, FBXNode pSkeletonRoot)
  406.         {
  407.             Dictionary<String, FBBone> pose = Skeleton.ModelBones;
  408.             foreach (string key in pose.Keys)
  409.             {
  410.                 FBBone bonePose = pose[key];
  411.                 FBXNode fbxBone = pSkeletonRoot.FindChild(key);
  412.                 FBXVector4 ForwardM = new FBXVector4(bonePose.Forward.members[0], bonePose.Forward.members[1], bonePose.Forward.members[2], 0);
  413.                 FBXVector4 RightM = new FBXVector4(bonePose.Right.members[0], bonePose.Right.members[1], bonePose.Right.members[2], 0);
  414.                 FBXVector4 UpM = new FBXVector4(bonePose.Up.members[0], bonePose.Up.members[1], bonePose.Up.members[2], 0);
  415.                 FBXVector4 TransM = new FBXVector4(bonePose.Location.members[0], bonePose.Location.members[1], bonePose.Location.members[2], 1);
  416.                 FBXAMatrix transfoMatrix = new FBXAMatrix();
  417.                 transfoMatrix.SetRow(0, RightM);
  418.                 transfoMatrix.SetRow(1, UpM);
  419.                 transfoMatrix.SetRow(2, ForwardM);
  420.                 transfoMatrix.SetRow(3, TransM);
  421.                 FBXHelper.SetGlobalDefaultPosition(fbxBone, transfoMatrix);
  422.             }
  423.         }
  424.  
  425.         private void AddNodeRecursively(List<FBXNode> pNodeArray, FBXNode pNode)
  426.         {
  427.             if (pNode != null)
  428.             {
  429.                 AddNodeRecursively(pNodeArray, pNode.GetParent());
  430.                 bool found = false;
  431.                 foreach (FBXNode n in pNodeArray)
  432.                     if (n.Equals(pNode))
  433.                     {
  434.                         found = true;
  435.                         break;
  436.                     }
  437.                 if (found)
  438.                     pNodeArray.Add(pNode);
  439.             }
  440.         }
  441.  
  442.         private void AddMorphToMesh(FBXScene pScene, FBXNode pFbxNode, List<Vector> morph)
  443.         {
  444.             FBXShape lShape = FBXShape.Create(pScene, "MorphShape");
  445.             FBXMesh mesh = (FBXMesh)pFbxNode.GetMesh();
  446.             int count = mesh.GetControlPointsCount();
  447.             lShape.InitControlPoints(count);
  448.             List<FBXVector4> lControlPoints = lShape.GetControlPoints();
  449.  
  450.             for (int i = 0; i < count; i++)
  451.             {
  452.                 FBXVector4 cp = new FBXVector4(morph[i].members[0], morph[i].members[1], morph[i].members[2], 0);
  453.                 lControlPoints[i] = cp;
  454.             }
  455.  
  456.         FBXBlendShape lBlendShape = FBXBlendShape.Create(pScene, "morph");
  457.         FBXBlendShapeChannel lBlendShapeChannel = FBXBlendShapeChannel.Create(pScene, "morphchannel");
  458.         mesh.AddDeformer(lBlendShape);
  459.         lBlendShape.AddBlendShapeChannel(lBlendShapeChannel);
  460.         lBlendShapeChannel.AddTargetShape(lShape);
  461.     }
  462.     }
  463. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement