Advertisement
Guest User

quaternions faster?

a guest
Sep 8th, 2018
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. //quat rotate
  2.  
  3. // 16 mul 12 add (done twice)
  4. // total is 32 mul 24 add
  5. quaternion quaternion::operator*(const quaternion &q) const
  6. {
  7.     quaternion result;
  8.  
  9.     //[s1,v1][s2,v2] = [s1s2 - v1 dot v2, s1v2 + s2v1 + v1 cross v2]
  10.     result.s = (s * q.s) - x * q.x - y * q.y - z * q.z; // 3 add 4 mul
  11.     result.x = s * q.x + q.s * x + y * q.z - z * q.y;   // 3 add 4 mul
  12.     result.y = s * q.y + q.s * y + z * q.x - x * q.z;   // 3 add 4 mul
  13.     result.z = s * q.z + q.s * z + x * q.y - y * q.x;   // 3 add 4 mul
  14.     return result;
  15. }
  16.  
  17.  
  18. //Matrix rotate
  19.  
  20. // sincos 24 mul 10 add
  21. void rotate_vector(float rad, vec3 &vec, const vec3 &axis)
  22. {
  23.     matrix3 m;
  24.     float   sinVal, cosVal, minusVal;
  25.  
  26.     sinVal = (float)sinf(rad); // sincos
  27.     cosVal = (float)cosf(rad);
  28.     minusVal = 1.0f - cosVal; // 1 add
  29.  
  30.     m.m[0] = cosVal + minusVal * axis.x * axis.x;       // 2 mul 1 add
  31.     m.m[1] = minusVal * axis.x * axis.y - sinVal * axis.z;  // 3 mul 1 add
  32.     m.m[2] = minusVal * axis.x * axis.z + sinVal * axis.y;  // 3 mul 1 add
  33.  
  34.     m.m[3] = minusVal * axis.y * axis.x + sinVal * axis.z;  // 3 mul 1 add
  35.     m.m[4] = cosVal + minusVal * axis.y * axis.y;       // 2 mul 1 add
  36.     m.m[5] = minusVal * axis.y * axis.z - sinVal * axis.x;  // 3 mul 1 add
  37.  
  38.     m.m[6] = minusVal * axis.z * axis.x - sinVal * axis.y;  // 3 mul 1 add
  39.     m.m[7] = minusVal * axis.z * axis.y + sinVal * axis.x;  // 3 mul 1 add
  40.     m.m[8] = cosVal + minusVal * axis.z * axis.z;       // 2 mul 1 add
  41.  
  42.     vec = m * vec;      // matrix multiply by vec3
  43. }
  44.  
  45.  
  46. // 9 mul 6 add total
  47. vec3 matrix3::operator*(const vec3 &vec) const
  48. {
  49.     vec3 result;
  50.  
  51.     result.x = vec.x * m[0] + vec.y * m[3] + vec.z * m[6]; // 3 mul 2 add
  52.     result.y = vec.x * m[1] + vec.y * m[4] + vec.z * m[7]; // 3 mul 2 add
  53.     result.z = vec.x * m[2] + vec.y * m[5] + vec.z * m[8]; // 3 mul 2 add
  54.     return result;
  55. }
  56.  
  57.  
  58.  
  59. vec3 quaternion::rotate(float delta, const vec3 &axis, const vec3 &vector)
  60. {
  61.     quaternion  v(0.0f, vector);
  62.     quaternion  result_quaternion;
  63.     vec3        result_vector;
  64.     float       cosval = (float)fcos(delta / 2);
  65.     float       sinval = (float)fsin(delta / 2);
  66.  
  67.     s = cosval;
  68.     x = sinval * axis.x;
  69.     y = sinval * axis.y;
  70.     z = sinval * axis.z;
  71.  
  72.     quaternion qinv(s, -x, -y, -z);
  73.     result_quaternion = (*this * v * qinv);
  74.     result_vector.x = result_quaternion.x;
  75.     result_vector.y = result_quaternion.y;
  76.     result_vector.z = result_quaternion.z;
  77.     return result_vector;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement