Skip to content

Commit 2d244ca

Browse files
committed
connect bones to parents in ExportSkeleton
+ clean up implementation
1 parent 6ca0f80 commit 2d244ca

File tree

1 file changed

+18
-83
lines changed

1 file changed

+18
-83
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 18 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -693,10 +693,6 @@ bool ExportMesh (MeshInfo meshInfo, FbxNode fbxNode)
693693
/// </summary>
694694
protected bool ExportSkinnedMesh (GameObject unityGo, FbxScene fbxScene, FbxNode fbxNode)
695695
{
696-
/*Animator unityAnimator = unityGo.GetComponent<Animator> ();
697-
if (unityAnimator == null)
698-
return;*/
699-
700696
SkinnedMeshRenderer unitySkin
701697
= unityGo.GetComponent<SkinnedMeshRenderer> ();
702698

@@ -709,10 +705,6 @@ SkinnedMeshRenderer unitySkin
709705
return false;
710706
}
711707

712-
// TODO: do we need this?
713-
// create node hierarchy
714-
//ExportNodeHierarchy (unityGo, fbxNode);
715-
716708
// export skeleton
717709
if (!ExportSkeleton (unitySkin, fbxScene)) {
718710
Debug.LogError("failed to export skeleton");
@@ -732,24 +724,11 @@ SkinnedMeshRenderer unitySkin
732724
return false;
733725
}
734726

735-
// lookup node w skin renderer
736-
FbxNode fbxMeshNode = fbxNode;//MapUnityObjectToFbxNode[unitySkin.gameObject];
737-
738-
// export material for mesh
739-
//var fbxMaterial = ExportMaterial (meshInfo.Materials, fbxScene);
740-
//fbxMeshNode.AddMaterial (fbxMaterial);
741-
742-
// set the fbxNode containing the mesh
743-
//fbxMeshNode.SetNodeAttribute (fbxMesh);
744-
//fbxMeshNode.SetShadingMode (FbxNode.EShadingMode.eWireFrame);
745-
746-
//fbxRootNode.AddChild (fbxMeshNode);
747-
748727
// bind mesh to skeleton
749-
ExportSkin (unitySkin, meshInfo, fbxScene, fbxMesh, fbxMeshNode);
728+
ExportSkin (unitySkin, meshInfo, fbxScene, fbxMesh, fbxNode);
750729

751730
// add bind pose
752-
ExportBindPose (fbxNode, fbxMeshNode, fbxScene);
731+
ExportBindPose (fbxNode, fbxScene);
753732

754733
if (Verbose)
755734
Debug.Log (string.Format ("exporting {0} {1}", "Skin", fbxNode.GetName ()));
@@ -795,16 +774,10 @@ private bool ExportSkeleton (SkinnedMeshRenderer skinnedMesh, FbxScene fbxScene)
795774
// its corresponding parent, or to the scene if there is none.
796775
FbxNode fbxBoneNode;
797776
if (!MapUnityObjectToFbxNode.TryGetValue(unityBoneTransform.gameObject, out fbxBoneNode)) {
798-
/*var unityParent = unityBoneTransform.parent;
799-
FbxNode fbxParent;
800-
if (MapUnityObjectToFbxNode.TryGetValue(unityParent.gameObject, out fbxParent)) {
801-
fbxBoneNode = FbxNode.Create (fbxParent, unityBoneTransform.name);
802-
} else {*/
803-
if (ExportSettings.mayaCompatibleNames) {
804-
unityBoneTransform.name = ConvertToMayaCompatibleName (unityBoneTransform.name);
805-
}
806-
fbxBoneNode = FbxNode.Create (fbxScene, unityBoneTransform.name);
807-
//}
777+
if (ExportSettings.mayaCompatibleNames) {
778+
unityBoneTransform.name = ConvertToMayaCompatibleName (unityBoneTransform.name);
779+
}
780+
fbxBoneNode = FbxNode.Create (fbxScene, unityBoneTransform.name);
808781
MapUnityObjectToFbxNode.Add(unityBoneTransform.gameObject, fbxBoneNode);
809782
}
810783

@@ -814,26 +787,26 @@ private bool ExportSkeleton (SkinnedMeshRenderer skinnedMesh, FbxScene fbxScene)
814787
var fbxSkeletonType = index.ContainsKey(unityBoneTransform.parent)
815788
? FbxSkeleton.EType.eLimbNode : FbxSkeleton.EType.eRoot;
816789
fbxSkeleton.SetSkeletonType (fbxSkeletonType);
817-
fbxSkeleton.Size.Set (1.0f);
790+
fbxSkeleton.Size.Set (1.0f*UnitScaleFactor);
818791
fbxBoneNode.SetNodeAttribute (fbxSkeleton);
819-
if (Verbose) { Debug.Log("Converted " + unityBoneTransform.name + " to a " + fbxSkeletonType + " bone"); }
792+
//if (Verbose) { Debug.Log("Converted " + unityBoneTransform.name + " to a " + fbxSkeletonType + " bone"); }
820793
}
821794
}
822795

823796
// Step 2: connect up the hierarchy.
824-
/*foreach (var unityBone in bones) {
825-
var fbxBone = MapUnityObjectToFbxNode[unityBone.gameObject];
826-
var fbxParent = MapUnityObjectToFbxNode[unityBone.parent.gameObject];
827-
fbxParent.AddChild(fbxBone);
828-
}*/
797+
foreach (var unityBone in bones) {
798+
var fbxBone = MapUnityObjectToFbxNode [unityBone.gameObject];
799+
if (unityBone.parent != null) {
800+
var fbxParent = MapUnityObjectToFbxNode [unityBone.parent.gameObject];
801+
fbxParent.AddChild (fbxBone);
802+
}
803+
}
829804

830805
// Step 3: set up the transforms.
831806
for (int boneIndex = 0, n = bones.Length; boneIndex < n; boneIndex++) {
832807
var unityBone = bones[boneIndex];
833808
var fbxBone = MapUnityObjectToFbxNode[unityBone.gameObject];
834809

835-
Debug.Log ("bone: " + unityBone.name);
836-
837810
Matrix4x4 pose;
838811
if (fbxBone.GetSkeleton().GetSkeletonType() == FbxSkeleton.EType.eRoot) {
839812
// bind pose is local -> root. We want root -> local, so invert.
@@ -860,7 +833,7 @@ private bool ExportSkeleton (SkinnedMeshRenderer skinnedMesh, FbxScene fbxScene)
860833
matrix.GetElements (out translation, out rotation, out shear, out scale, out sign);
861834

862835
// Bones should have zero rotation, and use a pivot instead.
863-
fbxBone.LclTranslation.Set (new FbxDouble3(translation.X, translation.Y, translation.Z));
836+
fbxBone.LclTranslation.Set (new FbxDouble3(translation.X*UnitScaleFactor, translation.Y*UnitScaleFactor, translation.Z*UnitScaleFactor));
864837
fbxBone.LclRotation.Set (new FbxDouble3(0,0,0));
865838
fbxBone.LclScaling.Set (new FbxDouble3 (scale.X, scale.Y, scale.Z));
866839

@@ -952,9 +925,9 @@ boneWeights [i].weight3
952925
/// <summary>
953926
/// Export bind pose of mesh to skeleton
954927
/// </summary>
955-
protected bool ExportBindPose (FbxNode fbxRootNode, FbxNode fbxMeshNode, FbxScene fbxScene)
928+
protected bool ExportBindPose (FbxNode fbxMeshNode, FbxScene fbxScene)
956929
{
957-
FbxPose fbxPose = FbxPose.Create (fbxScene, fbxRootNode.GetName());
930+
FbxPose fbxPose = FbxPose.Create (fbxScene, fbxMeshNode.GetName());
958931

959932
// set as bind pose
960933
fbxPose.SetIsBindPose (true);
@@ -985,43 +958,6 @@ protected bool ExportBindPose (FbxNode fbxRootNode, FbxNode fbxMeshNode, FbxScen
985958
return true;
986959
}
987960

988-
/// <summary>
989-
/// Get a mesh renderer's mesh.
990-
/// </summary>
991-
/*private MeshInfo GetSkinnedMeshInfo (GameObject gameObject)
992-
{
993-
// Verify that we are rendering. Otherwise, don't export.
994-
var renderer = gameObject.GetComponentInChildren<SkinnedMeshRenderer> ();
995-
if (!renderer || !renderer.enabled) {
996-
Debug.LogError ("could not find renderer");
997-
return new MeshInfo ();
998-
}
999-
1000-
var mesh = renderer.sharedMesh;
1001-
if (!mesh) {
1002-
Debug.LogError ("Could not find mesh");
1003-
return new MeshInfo ();
1004-
}
1005-
1006-
return new MeshInfo (gameObject, mesh, renderer);
1007-
}*/
1008-
1009-
/// <summary>
1010-
/// Create the node hierarchy and store the mapping from Unity
1011-
/// object to FBX node.
1012-
/// </summary>
1013-
/*protected void ExportNodeHierarchy (GameObject unityGo, FbxNode fbxParentNode)
1014-
{
1015-
FbxNode fbxNode = FbxNode.Create (fbxParentNode, unityGo.name);
1016-
1017-
MapUnityObjectToFbxNode [unityGo] = fbxNode;
1018-
1019-
foreach (Transform unityChild in unityGo.transform)
1020-
{
1021-
ExportNodeHierarchy (unityChild.gameObject, fbxNode);
1022-
}
1023-
}*/
1024-
1025961
/// <summary>
1026962
/// Takes a Quaternion and returns a Euler with XYZ rotation order.
1027963
/// Also converts from left (Unity) to righthanded (Maya) coordinates.
@@ -1251,7 +1187,6 @@ protected int ExportComponents (
12511187
if (!alreadyExported) {
12521188
Debug.Log ("here: " + unityGo.name);
12531189

1254-
12551190
ExportTransform (unityGo.transform, fbxNode, newCenter, exportType);
12561191

12571192
// try export mesh

0 commit comments

Comments
 (0)