bluesky8059

Untitled

Jul 27th, 2015
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.59 KB | None | 0 0
  1. class Quaternion
  2.     {
  3.         public double X, Y, Z, W;
  4.         //Quaternion Initialization
  5.         public Quaternion(double w, double x, double y, double z)
  6.         {
  7.             W = w;
  8.             X = x;
  9.             Y = y;
  10.             Z = z;
  11.         }
  12.  
  13.         //Use Axis and Angle to get a Quaternion
  14.         public Quaternion(double [] Axis, double Angle)
  15.         {
  16.  
  17.         }
  18.  
  19.         //Normalise
  20.         public void Normalise()
  21.         {
  22.             double m = W * W + X * X + Y * Y + Z * Z;
  23.             if (m > 0.001)
  24.             {
  25.                 m = Math.Sqrt(m);
  26.                 W /= m;
  27.                 X /= m;
  28.                 Y /= m;
  29.                 Z /= m;
  30.             }
  31.             else
  32.             {
  33.                 W = 1; X = 0; Y = 0; Z = 0;
  34.             }
  35.         }
  36.  
  37.         //Quaternion Conjugate
  38.         public static Quaternion Conjugate(Quaternion q)
  39.         {
  40.             double nw = q.W;
  41.             double nx = -(q.X);
  42.             double ny = -(q.Y);
  43.             double nz = -(q.Z);
  44.             return new Quaternion(nw, nx, ny, nz);
  45.         }
  46.  
  47.         //Quaternion Addition
  48.         public static Quaternion operator +(Quaternion q1, Quaternion q2)
  49.         {
  50.             double nw = q1.W + q2.W;
  51.             double nx = q1.X + q2.X;
  52.             double ny = q1.Y + q2.Y;
  53.             double nz = q1.Z + q2.Z;
  54.             return new Quaternion(nw, nx, ny, nz);
  55.         }
  56.  
  57.         //Quaternion Substration
  58.         public static Quaternion operator -(Quaternion q1, Quaternion q2)
  59.         {
  60.             double nw = q1.W - q2.W;
  61.             double nx = q1.X - q2.X;
  62.             double ny = q1.Y - q2.Y;
  63.             double nz = q1.Z - q2.Z;
  64.             return new Quaternion(nw, nx, ny, nz);
  65.         }
  66.  
  67.         //Quaternion Multiplication
  68.         // Multiplying q1 with q2 is meaning of doing q2 firstly then q1
  69.         public static Quaternion operator *(Quaternion q1, Quaternion q2)
  70.         {
  71.             double nw = q1.W * q2.W - q1.X * q2.X - q1.Y * q2.Y - q1.Z * q2.Z;
  72.             double nx = q1.W * q2.X + q1.X * q2.W + q1.Y * q2.Z - q1.Z * q2.Y;
  73.             double ny = q1.W * q2.Y - q1.X * q2.Z + q1.Y * q2.W + q1.Z * q2.X;
  74.             double nz = q1.W * q2.Z + q1.X * q2.Y - q1.Y * q2.X + q1.Z * q2.W;
  75.             return new Quaternion(nw, nx, ny, nz);
  76.         }
  77.  
  78.         //Quaternion Division (Multiply by the inverse)
  79.         public static Quaternion operator /(Quaternion q1, Quaternion q2)
  80.         {
  81.             Quaternion q2Conj = Conjugate(q2);
  82.             double norm = Math.Sqrt(q2.W * q2.W + q2.X * q2.X + q2.Y * q2.Y + q2.Z * q2.Z);
  83.             Quaternion newQ = q1 * q2Conj;
  84.             double nw = newQ.W / norm;
  85.             double nx = newQ.X / norm;
  86.             double ny = newQ.Y / norm;
  87.             double nz = newQ.Z / norm;
  88.             return new Quaternion(nw, nx, ny, nz);
  89.         }
  90.  
  91.         //Get the angle of rotation
  92.         public void GetAngle()
  93.         {
  94.  
  95.         }
  96.  
  97.         //Do the slerp
  98.         public static Quaternion Slerp(Quaternion q1, Quaternion q2, double t)
  99.         {
  100.             //w, x, y, z
  101.             double nw, nx, ny, nz;
  102.             //Calculate angle between them
  103.             double cosHalfTheta = q1.W * q2.W + q1.X * q2.X + q1.Y + q2.Y + q1.Z + q1.Z;
  104.                    
  105.            
  106.             //if q1 = q2 or q1 = -q2 then theta = 0, return q1
  107.             if (Math.Abs(cosHalfTheta) >= 1.0)
  108.             {
  109.                 nw = q2.W;
  110.                 nx = q2.X;
  111.                 ny = q2.Y;
  112.                 nz = q2.Z;
  113.                 return new Quaternion(nw, nx, ny, nz);
  114.             }
  115.  
  116.             //Calculate temporary values.
  117.             double halfTheta = Math.Acos(cosHalfTheta);
  118.             double sinHalfTheta = Math.Sqrt(1.0 - cosHalfTheta * cosHalfTheta);
  119.            
  120.             //if theta = 180 degrees then result is not fully defined
  121.             if(Math.Abs(sinHalfTheta) < 0.001){
  122.                 nw = (q1.W * 0.5 + q2.W * 0.5);
  123.                 nx = (q1.X * 0.5 + q2.X * 0.5);
  124.                 ny = (q1.Y * 0.5 + q2.Y * 0.5);
  125.                 nz = (q1.Z * 0.5 + q2.Z * 0.5);
  126.                 return new Quaternion(nw, nx, ny, nz);
  127.             }
  128.  
  129.             double ratioA = Math.Sin((1 - t) * halfTheta) / sinHalfTheta;
  130.             double ratioB = Math.Sin(t * halfTheta) / sinHalfTheta;  
  131.             //Calculate Quaternion
  132.             nw = (q1.W * ratioA + q2.W * ratioB);
  133.             nx = (q1.X * ratioA + q2.X * ratioB);
  134.             ny = (q1.Y * ratioA + q2.Y * ratioB);
  135.             nz = (q1.Z * ratioA + q2.Z * ratioB);
  136.             return new Quaternion(nw, nx, ny, nz);
  137.         }
  138.  
  139.     }
Advertisement
Add Comment
Please, Sign In to add comment