quat_mult.h 835 B

12345678910111213141516171819202122232425262728
  1. namespace igl
  2. {
  3. // Computes out = q1 * q2 with quaternion multiplication
  4. // A Quaternion, q, is defined here as an arrays of four scalars (x,y,z,w),
  5. // such that q = x*i + y*j + z*k + w
  6. // Inputs:
  7. // q1 left quaternion
  8. // q2 right quaternion
  9. // Outputs:
  10. // out result of multiplication
  11. inline void quat_mult(
  12. const double *q1,
  13. const double *q2,
  14. double *out);
  15. };
  16. // Implementation
  17. // http://www.antisphere.com/Wiki/tools:anttweakbar
  18. inline void igl::quat_mult(
  19. const double *q1,
  20. const double *q2,
  21. double *out)
  22. {
  23. out[0] = q1[3]*q2[0] + q1[0]*q2[3] + q1[1]*q2[2] - q1[2]*q2[1];
  24. out[1] = q1[3]*q2[1] + q1[1]*q2[3] + q1[2]*q2[0] - q1[0]*q2[2];
  25. out[2] = q1[3]*q2[2] + q1[2]*q2[3] + q1[0]*q2[1] - q1[1]*q2[0];
  26. out[3] = q1[3]*q2[3] - (q1[0]*q2[0] + q1[1]*q2[1] + q1[2]*q2[2]);
  27. }