Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }