public static Quaternion FromMatrix(Matrix4 m1) { float w = (float)System.Math.Sqrt(System.Math.Max(0, 1 + m1.M11 + m1.M22 + m1.M33)) / 2f; float x = (float)System.Math.Sqrt(System.Math.Max(0, 1 + m1.M11 - m1.M22 - m1.M33)) / 2f; float y = (float)System.Math.Sqrt(System.Math.Max(0, 1 - m1.M11 + m1.M22 - m1.M33)) / 2f; float z = (float)System.Math.Sqrt(System.Math.Max(0, 1 - m1.M11 - m1.M22 + m1.M33)) / 2f; x = FloatHelper.CopySign(x, m1.M32 - m1.M23); y = FloatHelper.CopySign(y, m1.M12 - m1.M31); z = FloatHelper.CopySign(z, m1.M21 - m1.M12); return(new Quaternion(x, y, z, w)); }
public static Quaternion FromMatrix(Matrix4 m1) { // if (false) // { // float w = (float)Math.Sqrt(1.0 + m1.M11 + m1.M22 + m1.M33) / 2.0f; // float w4 = (4.0f * w); // float x = (m1.M32 - m1.M23) / w4; // float y = (m1.M13 - m1.M31) / w4; // float z = (m1.M21 - m1.M12) / w4; // // return new Quaternion(x, y, z, w); // } float w = (float)System.Math.Sqrt(System.Math.Max(0, 1 + m1.M11 + m1.M22 + m1.M33)) / 2f; float x = (float)System.Math.Sqrt(System.Math.Max(0, 1 + m1.M11 - m1.M22 - m1.M33)) / 2f; float y = (float)System.Math.Sqrt(System.Math.Max(0, 1 - m1.M11 + m1.M22 - m1.M33)) / 2f; float z = (float)System.Math.Sqrt(System.Math.Max(0, 1 - m1.M11 - m1.M22 + m1.M33)) / 2f; x = FloatHelper.CopySign(x, m1.M32 - m1.M23); y = FloatHelper.CopySign(y, m1.M12 - m1.M31); z = FloatHelper.CopySign(z, m1.M21 - m1.M12); return(new Quaternion(x, y, z, w)); }