Skip to content

Commit 14b74f4

Browse files
committed
recenter the exported translation to group center
1 parent 1bf83cf commit 14b74f4

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ meshInfo.Vertices [v].z*UnitScaleFactor
503503
}
504504

505505
// get a fbxNode's global default position.
506-
protected void ExportTransform (UnityEngine.Transform unityTransform, FbxNode fbxNode, TransformExportType exportType)
506+
protected void ExportTransform (UnityEngine.Transform unityTransform, FbxNode fbxNode, Vector3 newCenter, TransformExportType exportType)
507507
{
508508
// Fbx rotation order is XYZ, but Unity rotation order is ZXY.
509509
// This causes issues when converting euler to quaternion, causing the final
@@ -522,7 +522,7 @@ protected void ExportTransform (UnityEngine.Transform unityTransform, FbxNode fb
522522
unityScale = Vector3.one;
523523
break;
524524
case TransformExportType.Global:
525-
unityTranslate = unityTransform.position;
525+
unityTranslate = GetRecenteredTranslation(unityTransform, newCenter);
526526
unityRotate = unityTransform.rotation.eulerAngles;
527527
unityScale = unityTransform.lossyScale;
528528
break;
@@ -592,7 +592,8 @@ protected bool ExportInstance (GameObject unityGo, FbxNode fbxNode, FbxScene fbx
592592
/// </summary>
593593
protected int ExportComponents (
594594
GameObject unityGo, FbxScene fbxScene, FbxNode fbxNodeParent,
595-
int exportProgress, int objectCount, TransformExportType exportType = TransformExportType.Local)
595+
int exportProgress, int objectCount, Vector3 newCenter,
596+
TransformExportType exportType = TransformExportType.Local)
596597
{
597598
int numObjectsExported = exportProgress;
598599

@@ -613,7 +614,7 @@ protected int ExportComponents (
613614
return -1;
614615
}
615616

616-
ExportTransform ( unityGo.transform, fbxNode, exportType);
617+
ExportTransform ( unityGo.transform, fbxNode, newCenter, exportType);
617618

618619
// try exporting mesh as an instance, export regularly if we cannot
619620
if (!ExportInstance (unityGo, fbxNode, fbxScene)) {
@@ -628,7 +629,7 @@ protected int ExportComponents (
628629

629630
// now unityGo through our children and recurse
630631
foreach (Transform childT in unityGo.transform) {
631-
numObjectsExported = ExportComponents (childT.gameObject, fbxScene, fbxNode, numObjectsExported, objectCount);
632+
numObjectsExported = ExportComponents (childT.gameObject, fbxScene, fbxNode, numObjectsExported, objectCount, newCenter);
632633
}
633634
return numObjectsExported;
634635
}
@@ -691,6 +692,13 @@ public static HashSet<GameObject> RemoveRedundantObjects(IEnumerable<UnityEngine
691692
return toExport;
692693
}
693694

695+
/// <summary>
696+
/// Recursively go through the hierarchy, adding up the bounding box centers
697+
/// of all the children, to help find the center of all selected objects.
698+
/// </summary>
699+
/// <returns>The number of GameObjects in hierarchy starting at t.</returns>
700+
/// <param name="t">Transform.</param>
701+
/// <param name="centerAverage">Sum of all the bounding box centers in hierarchy.</param>
694702
private int FindCenterRecursive(Transform t, ref Vector3 centerAverage)
695703
{
696704
var renderer = t.GetComponent <Renderer>();
@@ -717,9 +725,13 @@ private int FindCenterRecursive(Transform t, ref Vector3 centerAverage)
717725
return count;
718726
}
719727

728+
/// <summary>
729+
/// Finds the center of a group of GameObjects.
730+
/// </summary>
731+
/// <returns>Center of gameObjects.</returns>
732+
/// <param name="gameObjects">Game objects.</param>
720733
private Vector3 FindCenter(IEnumerable<GameObject> gameObjects)
721734
{
722-
// renderer, mesh, collider
723735
Vector3 average = Vector3.zero;
724736
int count = 0;
725737
foreach (var go in gameObjects) {
@@ -728,6 +740,17 @@ private Vector3 FindCenter(IEnumerable<GameObject> gameObjects)
728740
return average / count;
729741
}
730742

743+
/// <summary>
744+
/// Gets the recentered translation.
745+
/// </summary>
746+
/// <returns>The recentered translation.</returns>
747+
/// <param name="t">Transform.</param>
748+
/// <param name="center">Center point.</param>
749+
private Vector3 GetRecenteredTranslation(Transform t, Vector3 center)
750+
{
751+
return t.position - center;
752+
}
753+
731754
public enum TransformExportType { Local, Global, Reset };
732755

733756
/// <summary>
@@ -801,7 +824,9 @@ public int ExportAll (IEnumerable<UnityEngine.Object> unityExportSet)
801824

802825
if(revisedExportSet.Count == 1){
803826
foreach(var unityGo in revisedExportSet){
804-
exportProgress = this.ExportComponents (unityGo, fbxScene, fbxRootNode, exportProgress, count, TransformExportType.Reset);
827+
exportProgress = this.ExportComponents (
828+
unityGo, fbxScene, fbxRootNode, exportProgress,
829+
count, Vector3.zero, TransformExportType.Reset);
805830
if (exportProgress < 0) {
806831
Debug.LogWarning ("Export Cancelled");
807832
return 0;
@@ -815,8 +840,8 @@ public int ExportAll (IEnumerable<UnityEngine.Object> unityExportSet)
815840
test.transform.position = center;
816841

817842
foreach (var unityGo in revisedExportSet) {
818-
exportProgress = this.ExportComponents (unityGo, fbxScene, fbxRootNode, exportProgress, count,
819-
unityGo.transform.parent == null? TransformExportType.Local : TransformExportType.Global);
843+
exportProgress = this.ExportComponents (unityGo, fbxScene, fbxRootNode,
844+
exportProgress, count, center, TransformExportType.Global);
820845
if (exportProgress < 0) {
821846
Debug.LogWarning ("Export Cancelled");
822847
return 0;

0 commit comments

Comments
 (0)