Example #1
0
 /// <summary>
 /// Construct a quaternion that rotates from one direction to another
 /// </summary>
 /// <param name="startingDirection"></param>
 /// <param name="endingDirection"></param>
 public Quaternion(Vector3 startingDirection, Vector3 endingDirection)
 {
     if ((endingDirection + startingDirection).LengthSquared == 0)
     {
         endingDirection += new Vector3(.0000001, 0, 0);
     }
     this.xyz = Vector3Ex.Cross(endingDirection, startingDirection);
     this.w   = Math.Sqrt(Math.Pow(endingDirection.Length, 2) * Math.Pow(startingDirection.Length, 2)) + Vector3Ex.Dot(endingDirection, startingDirection);
     Normalize();
 }
 public static Vector3 GetPerpendicular(Vector3 a, Vector3 b)
 {
     if (!Collinear(a, b, Zero))
     {
         return(a.Cross(b));
     }
     else
     {
         Vector3 zOne = new Vector3(0, 0, 100000);
         if (!Collinear(a, b, zOne))
         {
             return(Vector3Ex.Cross(a - zOne, b - zOne));
         }
         else
         {
             Vector3 xOne = new Vector3(1000000, 0, 0);
             return(Vector3Ex.Cross(a - xOne, b - xOne));
         }
     }
 }
Example #3
0
 public Plane(Vector3 point0, Vector3 point1, Vector3 point2)
 {
     this.Normal             = Vector3Ex.Cross((point1 - point0), (point2 - point0)).GetNormal();
     this.DistanceFromOrigin = Vector3Ex.Dot(Normal, point0);
 }
Example #4
0
 /// <summary>
 /// Multiplies two instances.
 /// </summary>
 /// <param name="left">The first instance.</param>
 /// <param name="right">The second instance.</param>
 /// <param name="result">A new instance containing the result of the calculation.</param>
 public static void Multiply(ref Quaternion left, ref Quaternion right, out Quaternion result)
 {
     result = new Quaternion(
         right.W * left.Xyz + left.W * right.Xyz + Vector3Ex.Cross(left.Xyz, right.Xyz),
         left.W * right.W - Vector3Ex.Dot(left.Xyz, right.Xyz));
 }
Example #5
0
 public static Quaternion Mult(Quaternion left, Quaternion right)
 {
     return(new Quaternion(
                right.W * left.Xyz + left.W * right.Xyz + Vector3Ex.Cross(left.Xyz, right.Xyz),
                left.W * right.W - Vector3Ex.Dot(left.Xyz, right.Xyz)));
 }