Beispiel #1
0
    Vector3 quaternion2Euler(Quaternion q, RotSeq rotSeq)
    {
        switch (rotSeq)
        {
        case RotSeq.yxz:
            return(threeaxisrot(2 * (q.x * q.z + q.w * q.y),
                                q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                                -2 * (q.y * q.z - q.w * q.x),
                                2 * (q.x * q.y + q.w * q.z),
                                q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z));


        default:
            Debug.LogError("No good sequence");
            return(Vector3.zero);
        }
    }
Beispiel #2
0
        public static Quaternion FromEuler(Vector3 euler, RotSeq seq)
        {
            Quaternion result;
            var        x = Quaternion.Euler(euler.x, 0, 0);
            var        y = Quaternion.Euler(0, euler.y, 0);
            var        z = Quaternion.Euler(0, 0, euler.z);

            switch (seq)
            {
            case RotSeq.zyx:
                result = z * y * x;
                break;

            case RotSeq.yzx:
                result = y * z * x;
                break;

            case RotSeq.xzy:
                result = x * z * y;
                break;

            case RotSeq.zxy:
                result = z * x * y;
                break;

            case RotSeq.yxz:
                result = y * x * z;
                break;

            case RotSeq.xyz:
                result = x * y * z;
                break;

            default:
                throw new Exception();
            }
            return(result);
        }
        static Vector3 _quaternion2Euler(Quaternion q, RotSeq rotSeq)
        {
            switch (rotSeq)
            {
            case RotSeq.zyx:
                return(threeaxisrot(2 * (q.X * q.Y + q.W * q.Z),
                                    q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z,
                                    -2 * (q.X * q.Z - q.W * q.Y),
                                    2 * (q.Y * q.Z + q.W * q.X),
                                    q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z));


            case RotSeq.zyz:
                return(twoaxisrot(2 * (q.Y * q.Z - q.W * q.X),
                                  2 * (q.X * q.Z + q.W * q.Y),
                                  q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z,
                                  2 * (q.Y * q.Z + q.W * q.X),
                                  -2 * (q.X * q.Z - q.W * q.Y)));


            case RotSeq.zxy:
                return(threeaxisrot(-2 * (q.X * q.Y - q.W * q.Z),
                                    q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z,
                                    2 * (q.Y * q.Z + q.W * q.X),
                                    -2 * (q.X * q.Z - q.W * q.Y),
                                    q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z));


            case RotSeq.zxz:
                return(twoaxisrot(2 * (q.X * q.Z + q.W * q.Y),
                                  -2 * (q.Y * q.Z - q.W * q.X),
                                  q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z,
                                  2 * (q.X * q.Z - q.W * q.Y),
                                  2 * (q.Y * q.Z + q.W * q.X)));


            case RotSeq.yxz:
                return(threeaxisrot(2 * (q.X * q.Z + q.W * q.Y),
                                    q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z,
                                    -2 * (q.Y * q.Z - q.W * q.X),
                                    2 * (q.X * q.Y + q.W * q.Z),
                                    q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z));

            case RotSeq.yxy:
                return(twoaxisrot(2 * (q.X * q.Y - q.W * q.Z),
                                  2 * (q.Y * q.Z + q.W * q.X),
                                  q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z,
                                  2 * (q.X * q.Y + q.W * q.Z),
                                  -2 * (q.Y * q.Z - q.W * q.X)));


            case RotSeq.yzx:
                return(threeaxisrot(-2 * (q.X * q.Z - q.W * q.Y),
                                    q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z,
                                    2 * (q.X * q.Y + q.W * q.Z),
                                    -2 * (q.Y * q.Z - q.W * q.X),
                                    q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z));


            case RotSeq.yzy:
                return(twoaxisrot(2 * (q.Y * q.Z + q.W * q.X),
                                  -2 * (q.X * q.Y - q.W * q.Z),
                                  q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z,
                                  2 * (q.Y * q.Z - q.W * q.X),
                                  2 * (q.X * q.Y + q.W * q.Z)));


            case RotSeq.xyz:
                return(threeaxisrot(-2 * (q.Y * q.Z - q.W * q.X),
                                    q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z,
                                    2 * (q.X * q.Z + q.W * q.Y),
                                    -2 * (q.X * q.Y - q.W * q.Z),
                                    q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z));


            case RotSeq.xyx:
                return(twoaxisrot(2 * (q.X * q.Y + q.W * q.Z),
                                  -2 * (q.X * q.Z - q.W * q.Y),
                                  q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z,
                                  2 * (q.X * q.Y - q.W * q.Z),
                                  2 * (q.X * q.Z + q.W * q.Y)));


            case RotSeq.xzy:
                return(threeaxisrot(2 * (q.Y * q.Z - q.W * q.X),
                                    q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z,
                                    -2 * (q.X * q.Y + q.W * q.Z),
                                    2 * (q.X * q.Z - q.W * q.Y),
                                    q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z));


            case RotSeq.xzx:
                return(twoaxisrot(2 * (q.X * q.Z - q.W * q.Y),
                                  2 * (q.X * q.Y + q.W * q.Z),
                                  q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z,
                                  2 * (q.X * q.Z + q.W * q.Y),
                                  -2 * (q.X * q.Y - q.W * q.Z)));

            default:
                return(Vector3.Zero);
            }
        }
        public static System.Numerics.Vector3 quaternion2Euler(Quaternion q, RotSeq rotSeq)
        {
            Vector3 res    = _quaternion2Euler(q, rotSeq);
            var     result = new System.Numerics.Vector3();
            float   test   = q.W * q.Z + q.X * q.Y;
            float   unit   = q.X * q.X + q.Y * q.Y + q.Z * q.Z + q.W * q.W;

            switch (rotSeq)
            {
            case RotSeq.zyx:
                result.X = res.X;
                result.Y = res.Y;
                result.Z = res.Z;
                break;

            case RotSeq.zxy:
                result.X = res.Y;
                result.Y = res.X;
                result.Z = res.Z;
                break;

            case RotSeq.yxz:
                result.X = res.Z;
                result.Y = res.X;
                result.Z = res.Y;
                break;

            case RotSeq.yzx:
                result.X = res.X;
                result.Y = res.Z;
                result.Z = res.Y;
                if (test > 0.4995f * unit)
                {
                    result.X = 0.0f;
                    result.Y = 2.0f * (float)Math.Atan2(q.Y, q.Z);
                    result.Z = 90.0f * Utils.Deg2Rad;
                }
                if (test < -0.4995f * unit)
                {
                    result.X = 0.0f;
                    result.Y = -2.0f * (float)Math.Atan2(q.Y, q.Z);
                    result.Z = -90.0f * Utils.Deg2Rad;
                }
                break;

            case RotSeq.xyz:
                result.X = res.Z;
                result.Y = res.Y;
                result.Z = res.X;
                break;

            case RotSeq.xzy:
                result.X = -res.Z;
                result.Y = -res.X;
                result.Z = -res.Y;
                // Handle poles
                test = q.Y * q.Z - q.W * q.X;
                if (test > 0.4995f * unit)
                {
                    result.Y = 0.0f;
                    result.X = 2.0f * (float)Math.Atan2(q.X, q.Z);
                    result.Z = 90.0f * Utils.Deg2Rad;
                }
                if (test < -0.4995f * unit)
                {
                    result.Y = 0.0f;
                    result.X = -2.0f * (float)Math.Atan2(q.X, q.Z);
                    result.Z = -90.0f * Utils.Deg2Rad;
                }
                break;

            default:
                return(System.Numerics.Vector3.Zero);
            }
            result.X = (result.X <= -180.0f * Utils.Deg2Rad) ? result.X + 360.0f * Utils.Deg2Rad : result.X;
            result.Y = (result.Y <= -180.0f * Utils.Deg2Rad) ? result.Y + 360.0f * Utils.Deg2Rad : result.Y;
            result.Z = (result.Z <= -180.0f * Utils.Deg2Rad) ? result.Z + 360.0f * Utils.Deg2Rad : result.Z;
            return(result);
        }
Beispiel #5
0
    void quaternion2Euler(Quaternion q, ref Vector3 res, RotSeq rotSeq)
    {
        switch (rotSeq)
        {
        case RotSeq.zyx:
            threeaxisrot(2 * (q.x * q.y + q.w * q.z),
                         q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                         -2 * (q.x * q.z - q.w * q.y),
                         2 * (q.y * q.z + q.w * q.x),
                         q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                         ref res);
            break;

        case RotSeq.zyz:
            twoaxisrot(2 * (q.y * q.z - q.w * q.x),
                       2 * (q.x * q.z + q.w * q.y),
                       q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                       2 * (q.y * q.z + q.w * q.x),
                       -2 * (q.x * q.z - q.w * q.y),
                       ref res);
            break;

        case RotSeq.zxy:
            threeaxisrot(-2 * (q.x * q.y - q.w * q.z),
                         q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                         2 * (q.y * q.z + q.w * q.x),
                         -2 * (q.x * q.z - q.w * q.y),
                         q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                         ref res);
            break;

        case RotSeq.zxz:
            twoaxisrot(2 * (q.x * q.z + q.w * q.y),
                       -2 * (q.y * q.z - q.w * q.x),
                       q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                       2 * (q.x * q.z - q.w * q.y),
                       2 * (q.y * q.z + q.w * q.x),
                       ref res);
            break;

        case RotSeq.yxz:
            threeaxisrot(2 * (q.x * q.z + q.w * q.y),
                         q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                         -2 * (q.y * q.z - q.w * q.x),
                         2 * (q.x * q.y + q.w * q.z),
                         q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                         ref res);
            break;

        case RotSeq.yxy:
            twoaxisrot(2 * (q.x * q.y - q.w * q.z),
                       2 * (q.y * q.z + q.w * q.x),
                       q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                       2 * (q.x * q.y + q.w * q.z),
                       -2 * (q.y * q.z - q.w * q.x),
                       ref res);
            break;

        case RotSeq.yzx:
            threeaxisrot(-2 * (q.x * q.z - q.w * q.y),
                         q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                         2 * (q.x * q.y + q.w * q.z),
                         -2 * (q.y * q.z - q.w * q.x),
                         q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                         ref res);
            break;

        case RotSeq.yzy:
            twoaxisrot(2 * (q.y * q.z + q.w * q.x),
                       -2 * (q.x * q.y - q.w * q.z),
                       q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                       2 * (q.y * q.z - q.w * q.x),
                       2 * (q.x * q.y + q.w * q.z),
                       ref res);
            break;

        case RotSeq.xyz:
            threeaxisrot(-2 * (q.y * q.z - q.w * q.x),
                         q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                         2 * (q.x * q.z + q.w * q.y),
                         -2 * (q.x * q.y - q.w * q.z),
                         q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                         ref res);
            break;

        case RotSeq.xyx:
            twoaxisrot(2 * (q.x * q.y + q.w * q.z),
                       -2 * (q.x * q.z - q.w * q.y),
                       q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                       2 * (q.x * q.y - q.w * q.z),
                       2 * (q.x * q.z + q.w * q.y),
                       ref res);
            break;

        case RotSeq.xzy:
            threeaxisrot(2 * (q.y * q.z + q.w * q.x),
                         q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                         -2 * (q.x * q.y - q.w * q.z),
                         2 * (q.x * q.z + q.w * q.y),
                         q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                         ref res);
            break;

        case RotSeq.xzx:
            twoaxisrot(2 * (q.x * q.z - q.w * q.y),
                       2 * (q.x * q.y + q.w * q.z),
                       q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                       2 * (q.x * q.z + q.w * q.y),
                       -2 * (q.x * q.y - q.w * q.z),
                       ref res);
            break;

        default:
            break;
        }



        res.x = Mathf.Rad2Deg * (res.x);
        res.y = Mathf.Rad2Deg * (res.y);
        res.z = Mathf.Rad2Deg * (res.z);
    }
Beispiel #6
0
    private static Vector3 quaternion2Euler(Quaternion q, RotSeq rotSeq)
    {
        switch (rotSeq)
        {
        case RotSeq.zyx:
            return(Threeaxisrot(2 * (q.x * q.y + q.w * q.z),
                                q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                                -2 * (q.x * q.z - q.w * q.y),
                                2 * (q.y * q.z + q.w * q.x),
                                q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z));


        case RotSeq.zyz:
            return(Twoaxisrot(2 * (q.y * q.z - q.w * q.x),
                              2 * (q.x * q.z + q.w * q.y),
                              q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                              2 * (q.y * q.z + q.w * q.x),
                              -2 * (q.x * q.z - q.w * q.y)));


        case RotSeq.zxy:
            return(Threeaxisrot(-2 * (q.x * q.y - q.w * q.z),
                                q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                                2 * (q.y * q.z + q.w * q.x),
                                -2 * (q.x * q.z - q.w * q.y),
                                q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z));


        case RotSeq.zxz:
            return(Twoaxisrot(2 * (q.x * q.z + q.w * q.y),
                              -2 * (q.y * q.z - q.w * q.x),
                              q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                              2 * (q.x * q.z - q.w * q.y),
                              2 * (q.y * q.z + q.w * q.x)));


        case RotSeq.yxz:
            return(Threeaxisrot(2 * (q.x * q.z + q.w * q.y),
                                q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                                -2 * (q.y * q.z - q.w * q.x),
                                2 * (q.x * q.y + q.w * q.z),
                                q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z));

        case RotSeq.yxy:
            return(Twoaxisrot(2 * (q.x * q.y - q.w * q.z),
                              2 * (q.y * q.z + q.w * q.x),
                              q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                              2 * (q.x * q.y + q.w * q.z),
                              -2 * (q.y * q.z - q.w * q.x)));


        case RotSeq.yzx:

            return(Threeaxisrot(-2 * (q.x * q.z - q.w * q.y),
                                q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                                2 * (q.x * q.y + q.w * q.z),
                                -2 * (q.y * q.z - q.w * q.x),
                                q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z));


        case RotSeq.yzy:
            return(Twoaxisrot(2 * (q.y * q.z + q.w * q.x),
                              -2 * (q.x * q.y - q.w * q.z),
                              q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                              2 * (q.y * q.z - q.w * q.x),
                              2 * (q.x * q.y + q.w * q.z)));


        case RotSeq.xyz:
            return(Threeaxisrot(-2 * (q.y * q.z - q.w * q.x),
                                q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                                2 * (q.x * q.z + q.w * q.y),
                                -2 * (q.x * q.y - q.w * q.z),
                                q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));


        case RotSeq.xyx:
            return(Twoaxisrot(2 * (q.x * q.y + q.w * q.z),
                              -2 * (q.x * q.z - q.w * q.y),
                              q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                              2 * (q.x * q.y - q.w * q.z),
                              2 * (q.x * q.z + q.w * q.y)));


        case RotSeq.xzy:
            return(Threeaxisrot(2 * (q.y * q.z + q.w * q.x),
                                q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                                -2 * (q.x * q.y - q.w * q.z),
                                2 * (q.x * q.z + q.w * q.y),
                                q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));


        case RotSeq.xzx:
            return(Twoaxisrot(2 * (q.x * q.z - q.w * q.y),
                              2 * (q.x * q.y + q.w * q.z),
                              q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                              2 * (q.x * q.z + q.w * q.y),
                              -2 * (q.x * q.y - q.w * q.z)));

        default:
            Debug.LogError("No good sequence");
            return(Vector3.zero);
        }
    }
Beispiel #7
0
        void quaternion2Euler(Quaternion q, out Vector3 ypr, RotSeq rotSeq)
        {
            Vector3 res = new Vector3(0);

            switch (rotSeq)
            {
            case RotSeq.zyx:
                threeaxisrot(2 * (q.X * q.Y + q.W * q.Z),
                             q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z,
                             -2 * (q.X * q.Z - q.W * q.Y),
                             2 * (q.Y * q.Z + q.W * q.X),
                             q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z,
                             out res);
                break;

            case RotSeq.zxy:
                threeaxisrot(-2 * (q.X * q.Y - q.W * q.Z),
                             q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z,
                             2 * (q.Y * q.Z + q.W * q.X),
                             -2 * (q.X * q.Z - q.W * q.Y),
                             q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z,
                             out res);
                break;

            case RotSeq.yxz:     //то что нужно!
                threeaxisrot(2 * (q.X * q.Z + q.W * q.Y),
                             q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z,
                             -2 * (q.Y * q.Z - q.W * q.X),
                             2 * (q.X * q.Y + q.W * q.Z),
                             q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z,
                             out res);
                break;

            case RotSeq.yzx:
                threeaxisrot(-2 * (q.X * q.Z - q.W * q.Y),
                             q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z,
                             2 * (q.X * q.Y + q.W * q.Z),
                             -2 * (q.Y * q.Z - q.W * q.X),
                             q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z,
                             out res);
                break;

            case RotSeq.xyz:
                threeaxisrot(-2 * (q.Y * q.Z - q.W * q.X),
                             q.W * q.W - q.X * q.X - q.Y * q.Y + q.Z * q.Z,
                             2 * (q.X * q.Z + q.W * q.Y),
                             -2 * (q.X * q.Y - q.W * q.Z),
                             q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z,
                             out res);
                break;

            case RotSeq.xzy:
                threeaxisrot(2 * (q.Y * q.Z + q.W * q.X),
                             q.W * q.W - q.X * q.X + q.Y * q.Y - q.Z * q.Z,
                             -2 * (q.X * q.Y - q.W * q.Z),
                             2 * (q.X * q.Z + q.W * q.Y),
                             q.W * q.W + q.X * q.X - q.Y * q.Y - q.Z * q.Z,
                             out res);
                break;

            default:
                break;
            }
            ypr = res;
        }
Beispiel #8
0
        // note:
        // return values of res[] depends on rotSeq.
        // i.e.
        // for rotSeq zyx,
        // x = res[0], y = res[1], z = res[2]
        // for rotSeq xyz
        // z = res[0], y = res[1], x = res[2]
        // ...
        public static Vector3 ToEuler(Quaternion q, RotSeq rotSeq)
        {
            q = normalize(q);
            var v = new float[3];

            switch (rotSeq)
            {
            case RotSeq.zyx:
                threeaxisrot(2 * (q.x * q.y + q.w * q.z),
                             q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                             -2 * (q.x * q.z - q.w * q.y),
                             2 * (q.y * q.z + q.w * q.x),
                             q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                             v);
                break;

            case RotSeq.zyz:
                twoaxisrot(2 * (q.y * q.z - q.w * q.x),
                           2 * (q.x * q.z + q.w * q.y),
                           q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                           2 * (q.y * q.z + q.w * q.x),
                           -2 * (q.x * q.z - q.w * q.y),
                           v);
                break;

            case RotSeq.zxy:
                threeaxisrot(-2 * (q.x * q.y - q.w * q.z),
                             q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                             2 * (q.y * q.z + q.w * q.x),
                             -2 * (q.x * q.z - q.w * q.y),
                             q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                             v);
                break;

            case RotSeq.zxz:
                twoaxisrot(2 * (q.x * q.z + q.w * q.y),
                           -2 * (q.y * q.z - q.w * q.x),
                           q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                           2 * (q.x * q.z - q.w * q.y),
                           2 * (q.y * q.z + q.w * q.x),
                           v);
                break;

            case RotSeq.yxz:
                threeaxisrot(2 * (q.x * q.z + q.w * q.y),
                             q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                             -2 * (q.y * q.z - q.w * q.x),
                             2 * (q.x * q.y + q.w * q.z),
                             q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                             v);
                break;

            case RotSeq.yxy:
                twoaxisrot(2 * (q.x * q.y - q.w * q.z),
                           2 * (q.y * q.z + q.w * q.x),
                           q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                           2 * (q.x * q.y + q.w * q.z),
                           -2 * (q.y * q.z - q.w * q.x),
                           v);
                break;

            case RotSeq.yzx:
                threeaxisrot(-2 * (q.x * q.z - q.w * q.y),
                             q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                             2 * (q.x * q.y + q.w * q.z),
                             -2 * (q.y * q.z - q.w * q.x),
                             q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                             v);
                break;

            case RotSeq.yzy:
                twoaxisrot(2 * (q.y * q.z + q.w * q.x),
                           -2 * (q.x * q.y - q.w * q.z),
                           q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                           2 * (q.y * q.z - q.w * q.x),
                           2 * (q.x * q.y + q.w * q.z),
                           v);
                break;

            case RotSeq.xyz:
                threeaxisrot(-2 * (q.y * q.z - q.w * q.x),
                             q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z,
                             2 * (q.x * q.z + q.w * q.y),
                             -2 * (q.x * q.y - q.w * q.z),
                             q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                             v);
                break;

            case RotSeq.xyx:
                twoaxisrot(2 * (q.x * q.y + q.w * q.z),
                           -2 * (q.x * q.z - q.w * q.y),
                           q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                           2 * (q.x * q.y - q.w * q.z),
                           2 * (q.x * q.z + q.w * q.y),
                           v);
                break;

            case RotSeq.xzy:
                threeaxisrot(2 * (q.y * q.z + q.w * q.x),
                             q.w * q.w - q.x * q.x + q.y * q.y - q.z * q.z,
                             -2 * (q.x * q.y - q.w * q.z),
                             2 * (q.x * q.z + q.w * q.y),
                             q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                             v);
                break;

            case RotSeq.xzx:
                twoaxisrot(2 * (q.x * q.z - q.w * q.y),
                           2 * (q.x * q.y + q.w * q.z),
                           q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z,
                           2 * (q.x * q.z + q.w * q.y),
                           -2 * (q.x * q.y - q.w * q.z),
                           v);
                break;

            default:
                throw new Exception();
            }
            return(new Vector3(v[0], v[1], v[2]) * Mathf.Rad2Deg);
        }
Beispiel #9
0
    public static System.Numerics.Vector3 quaternion2EulerDeg(Quaternion q, RotSeq rotSeq)
    {
        Vector3 res    = quaternion2Euler(q, rotSeq);
        var     result = new System.Numerics.Vector3();
        float   test   = q.w * q.z + q.x * q.y;
        float   unit   = q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w;

        switch (rotSeq)
        {
        case RotSeq.zyx:
            result.X = res.x * Mathf.Rad2Deg;
            result.Y = res.y * Mathf.Rad2Deg;
            result.Z = res.z * Mathf.Rad2Deg;
            break;

        case RotSeq.zxy:
            result.X = res.y * Mathf.Rad2Deg;
            result.Y = res.x * Mathf.Rad2Deg;
            result.Z = res.z * Mathf.Rad2Deg;
            break;

        case RotSeq.yxz:
            result.X = res.z * Mathf.Rad2Deg;
            result.Y = res.x * Mathf.Rad2Deg;
            result.Z = res.y * Mathf.Rad2Deg;
            break;

        case RotSeq.yzx:
            result.X = res.x * Mathf.Rad2Deg;
            result.Y = res.z * Mathf.Rad2Deg;
            result.Z = res.y * Mathf.Rad2Deg;
            // Handle poles
            if (test > 0.4995f * unit)
            {
                result.X = 0.0f;
                result.Y = 2.0f * Mathf.Atan2(q.y, q.z) * Mathf.Rad2Deg;
                result.Z = 90.0f;
            }
            if (test < -0.4995f * unit)
            {
                result.X = 0.0f;
                result.Y = -2.0f * Mathf.Atan2(q.y, q.z) * Mathf.Rad2Deg;
                result.Z = -90.0f;
            }
            break;

        case RotSeq.xyz:
            result.X = res.z * Mathf.Rad2Deg;
            result.Y = res.y * Mathf.Rad2Deg;
            result.Z = res.x * Mathf.Rad2Deg;
            break;

        case RotSeq.xzy:
            result.X = res.y * Mathf.Rad2Deg;
            result.Y = res.z * Mathf.Rad2Deg;
            result.Z = res.x * Mathf.Rad2Deg;
            break;

        default:
            Debug.LogError("No good sequence");
            return(System.Numerics.Vector3.Zero);
        }
        result.X = (result.X <= -180.0f) ? result.X + 360.0f : result.X;
        result.Y = (result.Y <= -180.0f) ? result.Y + 360.0f : result.Y;
        result.Z = (result.Z <= -180.0f) ? result.Z + 360.0f : result.Z;
        return(result);
    }