private FBXVector GetEulerXYZ(CSGGroup group, float time) { CSGMatrix transformLH = new CSGMatrix(); group.GetTransform(group.Parent, time, ref transformLH); var transformRH = ConvertTransformToRightHanded_ThisLittleBitTookFourDaysToFigureOut(transformLH); FBXMatrix matrix = new FBXMatrix( transformRH.m11, transformRH.m12, transformRH.m13, transformRH.m14, transformRH.m21, transformRH.m22, transformRH.m23, transformRH.m24, transformRH.m31, transformRH.m32, transformRH.m33, transformRH.m34, transformRH.m41, transformRH.m42, transformRH.m43, transformRH.m44); FBXQuaternion fbxQuaternionRH = matrix.GetQuaternion(); var eulerXYZRH = fbxQuaternionRH.DecomposeSphericalXYZ(); return(eulerXYZRH); }
private static CSGMatrix ConvertTransformToRightHanded_ThisLittleBitTookFourDaysToFigureOut(CSGMatrix transform) { // mirror each base vector's z component transform.m13 *= -1; transform.m23 *= -1; transform.m33 *= -1; transform.m43 *= -1; // and now invert the Z base vector to keep the matrix decomposable // will come out just fine when the meshes are locally mirrored as well transform.m31 *= -1; transform.m32 *= -1; transform.m33 *= -1; // NOTE: this is inverted twice. Not sure why, but if there is a bug, this is probably it. transform.m34 *= -1; return(transform); }