Example #1
0
 public static Quaternion Negate(Quaternion value)
 {
     Quaternion result;
     result.W = -value.W;
     result.X = -value.X;
     result.Y = -value.Y;
     result.Z = -value.Z;
     return result;
 }
Example #2
0
 public static void Negate(ref Quaternion value)
 {
     Negate(ref value, out value);
 }
Example #3
0
 public static Quaternion Subtract(Quaternion left, Quaternion right)
 {
     Quaternion result;
     result.W = left.W - right.W;
     result.X = left.X - right.X;
     result.Y = left.Y - right.Y;
     result.Z = left.Z - right.Z;
     return result;
 }
Example #4
0
 public static void Subtract(ref Quaternion left,ref Quaternion right, out Quaternion result)
 {
     result.W = left.W - right.W;
     result.X = left.X - right.X;
     result.Y = left.Y - right.Y;
     result.Z = left.Z - right.Z;
 }
Example #5
0
 public static Quaternion Add(Quaternion left, Quaternion right)
 {
     Quaternion result;
     result.W = left.W + right.W;
     result.X = left.X + right.X;
     result.Y = left.Y + right.Y;
     result.Z = left.Z + right.Z;
     return result;
 }
Example #6
0
 public static void Add(ref Quaternion left,ref Quaternion right, out Quaternion result)
 {
     result.W = left.W + right.W;
     result.X = left.X + right.X;
     result.Y = left.Y + right.Y;
     result.Z = left.Z + right.Z;
 }
Example #7
0
        public static Quaternion Multiply(Quaternion left, Scalar scalar)
        {

            Quaternion result;
            result.W = left.W * scalar;
            result.X = left.X * scalar;
            result.Y = left.Y * scalar;
            result.Z = left.Z * scalar;
            return result;
        }
Example #8
0
        /// <summary>
        /// Creates a Quaternion from a supplied angle and aXis.
        /// </summary>
        /// <param name="angle">Value of an angle in radians.</param>
        /// <param name="aXis">ArbitrarY aXis vector.</param>
        /// <returns></returns>
        public static Quaternion FromAngleAxis(Scalar angle, Vector3D aXis)
        {
            Quaternion quat = new Quaternion();

            Scalar halfAngle = 0.5f * angle;
            Scalar sin = MathHelper.Sin(halfAngle);

            quat.W = MathHelper.Cos(halfAngle);
            quat.X = sin * aXis.X;
            quat.Y = sin * aXis.Y;
            quat.Z = sin * aXis.Z;

            return quat;
        }
Example #9
0
 public static Quaternion Multiply(Quaternion left, Quaternion right)
 {
     Quaternion result;
     result.W = left.W * right.W - left.X * right.X - left.Y * right.Y - left.Z * right.Z;
     result.X = left.W * right.X + left.X * right.W + left.Y * right.Z - left.Z * right.Y;
     result.Y = left.W * right.Y + left.Y * right.W + left.Z * right.X - left.X * right.Z;
     result.Z = left.W * right.Z + left.Z * right.W + left.X * right.Y - left.Y * right.X;
     return result;
 }
Example #10
0
        public static void Multiply(ref Quaternion left,ref Quaternion right,out Quaternion result)
        {
            Scalar W = left.W * right.W - left.X * right.X - left.Y * right.Y - left.Z * right.Z;
            Scalar X = left.W * right.X + left.X * right.W + left.Y * right.Z - left.Z * right.Y;
            Scalar Y = left.W * right.Y + left.Y * right.W + left.Z * right.X - left.X * right.Z;
            result.Z = left.W * right.Z + left.Z * right.W + left.X * right.Y - left.Y * right.X;

            result.W = W;
            result.X = X;
            result.Y = Y;

        }
Example #11
0
 /// <summary>
 /// Performs a Dot Product operation on 2 Quaternions.
 /// </summary>
 /// <param name="quat"></param>
 /// <returns></returns>
 public Scalar Dot(Quaternion quat)
 {
     return this.W * quat.W + this.X * quat.X + this.Y * quat.Y + this.Z * quat.Z;
 }
Example #12
0
        /// <summary>
        ///		Performs spherical quadratic interpolation.
        /// </summary>
        /// <param name="t"></param>
        /// <param name="p"></param>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="q"></param>
        /// <returns></returns>
        public static Quaternion Squad(Scalar t, Quaternion p, Quaternion a, Quaternion b, Quaternion q, bool useShortestPath)
        {
            Scalar slerpT = 2.0f * t * (1.0f - t);

            // use spherical linear interpolation
            Quaternion slerpP = Slerp(t, p, q, useShortestPath);
            Quaternion slerpQ = Slerp(t, a, b);

            // run another Slerp on the returnvalues of the first 2, and return the returnvalues
            return Slerp(slerpT, slerpP, slerpQ);
        }
Example #13
0
 public static Quaternion Squad(Scalar t, Quaternion p, Quaternion a, Quaternion b, Quaternion q)
 {
     return Squad(t, p, a, b, q, false);
 }
Example #14
0
 public static void Negate(ref Quaternion value, out Quaternion result)
 {
     result.W = -value.W;
     result.X = -value.X;
     result.Y = -value.Y;
     result.Z = -value.Z;
 }
Example #15
0
 public static void Multiply(ref Quaternion left,ref Scalar scalar, out Quaternion result)
 {
     result.W = left.W * scalar;
     result.X = left.X * scalar;
     result.Y = left.Y * scalar;
     result.Z = left.Z * scalar;
 }
Example #16
0
 public static Quaternion Slerp(Scalar time, Quaternion quatA, Quaternion quatB)
 {
     return Slerp(time, quatA, quatB, false);
 }
Example #17
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="time"></param>
        /// <param name="quatA"></param>
        /// <param name="quatB"></param>
        /// <param name="useShortestPath"></param>
        /// <returns></returns>
        public static Quaternion Slerp(Scalar time, Quaternion quatA, Quaternion quatB, bool useShortestPath)
        {
            Scalar cos = quatA.Dot(quatB);

            Scalar angle = MathHelper.Acos(cos);

            if (MathHelper.Abs(angle) < MathHelper.EPSILON)
            {
                return quatA;
            }

            Scalar sin = MathHelper.Sin(angle);
            Scalar inverseSin = 1.0f / sin;
            Scalar coeff0 = MathHelper.Sin((1.0f - time) * angle) * inverseSin;
            Scalar coeff1 = MathHelper.Sin(time * angle) * inverseSin;

            Quaternion returnvalue;

            if (cos < 0.0f && useShortestPath)
            {
                coeff0 = -coeff0;
                // taking the complement requires renormalisation
                Quaternion t = coeff0 * quatA + coeff1 * quatB;
                t.Normalize();
                returnvalue = t;
            }
            else
            {
                returnvalue = (coeff0 * quatA + coeff1 * quatB);
            }

            return returnvalue;
        }