Ejemplo n.º 1
0
            public static V3f Original(Rot3f r)
            {
                var test = r.W * r.Y - r.X * r.Z;

                if (test > 0.5f - Constant <float> .PositiveTinyValue) // singularity at north pole
                {
                    return(new V3f(
                               2 * Fun.Atan2(r.X, r.W),
                               (float)Constant.PiHalf,
                               0));
                }
                if (test < -0.5f + Constant <float> .PositiveTinyValue) // singularity at south pole
                {
                    return(new V3f(
                               2 * Fun.Atan2(r.X, r.W),
                               -(float)Constant.PiHalf,
                               0));
                }
                // From Wikipedia, conversion between quaternions and Euler angles.
                return(new V3f(
                           Fun.Atan2(2 * (r.W * r.X + r.Y * r.Z),
                                     1 - 2 * (r.X * r.X + r.Y * r.Y)),
                           Fun.AsinClamped(2 * test),
                           Fun.Atan2(2 * (r.W * r.Z + r.X * r.Y),
                                     1 - 2 * (r.Y * r.Y + r.Z * r.Z))));
            }
Ejemplo n.º 2
0
            public static __v3t__ Original(__rot3t__ r)
            {
                var test = r.W * r.Y - r.X * r.Z;

                if (test > __half__ - Constant <__rtype__> .PositiveTinyValue) // singularity at north pole
                {
                    return(new __v3t__(
                               2 * Fun.Atan2(r.X, r.W),
                               __piHalf__,
                               0));
                }
                if (test < -__half__ + Constant <__rtype__> .PositiveTinyValue) // singularity at south pole
                {
                    return(new __v3t__(
                               2 * Fun.Atan2(r.X, r.W),
                               -__piHalf__,
                               0));
                }
                // From Wikipedia, conversion between quaternions and Euler angles.
                return(new __v3t__(
                           Fun.Atan2(2 * (r.W * r.X + r.Y * r.Z),
                                     1 - 2 * (r.X * r.X + r.Y * r.Y)),
                           Fun.AsinClamped(2 * test),
                           Fun.Atan2(2 * (r.W * r.Z + r.X * r.Y),
                                     1 - 2 * (r.Y * r.Y + r.Z * r.Z))));
            }
Ejemplo n.º 3
0
            public static V3f CopySign(Rot3f r)
            {
                var test = r.W * r.Y - r.X * r.Z;

                if (test.Abs() >= 0.5f - Constant <float> .PositiveTinyValue)
                {
                    return(new V3f(
                               2 * Fun.Atan2(r.X, r.W),
                               Fun.CopySign((float)Constant.PiHalf, test),
                               0));
                }
                else
                {
                    return(new V3f(
                               Fun.Atan2(2 * (r.W * r.X + r.Y * r.Z),
                                         1 - 2 * (r.X * r.X + r.Y * r.Y)),
                               Fun.AsinClamped(2 * test),
                               Fun.Atan2(2 * (r.W * r.Z + r.X * r.Y),
                                         1 - 2 * (r.Y * r.Y + r.Z * r.Z))));
                }
            }
Ejemplo n.º 4
0
            public static __v3t__ CopySign(__rot3t__ r)
            {
                var test = r.W * r.Y - r.X * r.Z;

                if (test.Abs() >= __half__ - Constant <__rtype__> .PositiveTinyValue)
                {
                    return(new __v3t__(
                               2 * Fun.Atan2(r.X, r.W),
                               Fun.CopySign(__piHalf__, test),
                               0));
                }
                else
                {
                    return(new __v3t__(
                               Fun.Atan2(2 * (r.W * r.X + r.Y * r.Z),
                                         1 - 2 * (r.X * r.X + r.Y * r.Y)),
                               Fun.AsinClamped(2 * test),
                               Fun.Atan2(2 * (r.W * r.Z + r.X * r.Y),
                                         1 - 2 * (r.Y * r.Y + r.Z * r.Z))));
                }
            }