Guest User

Quaternion from direction (or forward) and up vectors

a guest
Feb 3rd, 2015
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.22 KB | None | 0 0
  1.     //XYZ is a 3D vector class with components X, Y, and Z
  2.     //Obvious thing but worth mentioning: if converting this to
  3.     //use floats, make sure you convert all literal doubles
  4.     //to end in f (1.0 becomes 1.0f, 0.5 becomes 0.5f, etc)
  5.  
  6.     public static Quaternion LookRotation(XYZ forward, XYZ up)
  7.     {
  8.         forward = forward.Normalize();
  9.  
  10.         XYZ vector = forward.Normalize();
  11.         XYZ vector2 = up.CrossProduct(vector).Normalize();
  12.         XYZ vector3 = vector.CrossProduct(vector2);
  13.         var m00 = vector2.X;
  14.         var m01 = vector2.Y;
  15.         var m02 = vector2.Z;
  16.         var m10 = vector3.X;
  17.         var m11 = vector3.Y;
  18.         var m12 = vector3.Z;
  19.         var m20 = vector.X;
  20.         var m21 = vector.Y;
  21.         var m22 = vector.Z;
  22.  
  23.         double num8 = (m00 + m11) + m22;
  24.         var quaternion = new Quaternion();
  25.         if (num8 > 0.0)
  26.         {
  27.             var num = (double)Math.Sqrt(num8 + 1.0);
  28.             quaternion.w = num * 0.5;
  29.             num = 0.5 / num;
  30.             quaternion.x = (m12 - m21) * num;
  31.             quaternion.y = (m20 - m02) * num;
  32.             quaternion.z = (m01 - m10) * num;
  33.             return quaternion;
  34.         }
  35.         if ((m00 >= m11) && (m00 >= m22))
  36.         {
  37.             var num7 = (double)Math.Sqrt(((1.0 + m00) - m11) - m22);
  38.             var num4 = 0.5 / num7;
  39.             quaternion.x = 0.5 * num7;
  40.             quaternion.y = (m01 + m10) * num4;
  41.             quaternion.z = (m02 + m20) * num4;
  42.             quaternion.w = (m12 - m21) * num4;
  43.             return quaternion;
  44.         }
  45.         if (m11 > m22)
  46.         {
  47.             var num6 = (double)Math.Sqrt(((1.0 + m11) - m00) - m22);
  48.             var num3 = 0.5 / num6;
  49.             quaternion.x = (m10 + m01) * num3;
  50.             quaternion.y = 0.5 * num6;
  51.             quaternion.z = (m21 + m12) * num3;
  52.             quaternion.w = (m20 - m02) * num3;
  53.             return quaternion;
  54.         }
  55.         var num5 = (double)Math.Sqrt(((1.0 + m22) - m00) - m11);
  56.         var num2 = 0.5 / num5;
  57.         quaternion.x = (m20 + m02) * num2;
  58.         quaternion.y = (m21 + m12) * num2;
  59.         quaternion.z = 0.5 * num5;
  60.         quaternion.w = (m01 - m10) * num2;
  61.         return quaternion;
  62.     }
Advertisement
Add Comment
Please, Sign In to add comment