Skip to content

Commit f4d8a98

Browse files
committed
export rotation with xyz rotation order
ZXY rotation order doesn't get imported into Maya properly. Maya modifies the rotation values AND sets the rotation order to by ZXY instead of just setting the rotation order to ZXY (which would have been sufficient) Also fix so canceling export once doesn't cancel every export you do afterwards.
1 parent cd9a9d5 commit f4d8a98

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

Assets/FbxExporters/Editor/FbxExporter.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -502,14 +502,29 @@ meshInfo.Vertices [v].z*UnitScaleFactor
502502
return fbxMesh;
503503
}
504504

505+
/// <summary>
506+
/// Takes a Quaternion and returns a Euler with XYZ rotation order.
507+
/// </summary>
508+
/// <returns>Euler with XYZ rotation order.</returns>
509+
public static Vector3 QuaternionToXYZEuler(Quaternion q)
510+
{
511+
FbxQuaternion quat = new FbxQuaternion (q.x, q.y, q.z, q.w);
512+
FbxAMatrix m = new FbxAMatrix ();
513+
m.SetQ (quat);
514+
var vector4 = m.GetR ();
515+
var result = new Vector3 ((float)vector4.X, (float)vector4.Y, (float)vector4.Z);
516+
517+
return result;
518+
}
519+
505520
// get a fbxNode's global default position.
506521
protected void ExportTransform (UnityEngine.Transform unityTransform, FbxNode fbxNode, TransformExportType exportType)
507522
{
508523
// Fbx rotation order is XYZ, but Unity rotation order is ZXY.
509524
// This causes issues when converting euler to quaternion, causing the final
510525
// rotation to be slighlty off.
511-
// Fixed if we set the rotation order to the Unity rotation order in the FBX.
512-
fbxNode.SetRotationOrder (FbxNode.EPivotSet.eSourcePivot, FbxEuler.EOrder.eOrderZXY);
526+
// Fixed by exporting the rotations as eulers with XYZ rotation order.
527+
fbxNode.SetRotationOrder (FbxNode.EPivotSet.eSourcePivot, FbxEuler.EOrder.eOrderXYZ);
513528

514529
UnityEngine.Vector3 unityTranslate;
515530
UnityEngine.Vector3 unityRotate;
@@ -523,12 +538,12 @@ protected void ExportTransform (UnityEngine.Transform unityTransform, FbxNode fb
523538
break;
524539
case TransformExportType.Global:
525540
unityTranslate = unityTransform.position;
526-
unityRotate = unityTransform.rotation.eulerAngles;
541+
unityRotate = QuaternionToXYZEuler(unityTransform.rotation);
527542
unityScale = unityTransform.lossyScale;
528543
break;
529544
default: /*case TransformExportType.Local*/
530545
unityTranslate = unityTransform.localPosition;
531-
unityRotate = unityTransform.localRotation.eulerAngles;
546+
unityRotate = QuaternionToXYZEuler(unityTransform.localRotation);
532547
unityScale = unityTransform.localScale;
533548
break;
534549
}
@@ -699,6 +714,7 @@ public enum TransformExportType { Local, Global, Zeroed };
699714
/// </summary>
700715
public int ExportAll (IEnumerable<UnityEngine.Object> unityExportSet)
701716
{
717+
exportCancelled = false;
702718
Verbose = true;
703719
try {
704720
// Create the FBX manager

0 commit comments

Comments
 (0)