quaternion_geometric.inl 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. namespace glm
  2. {
  3. template<typename T, qualifier Q>
  4. GLM_FUNC_QUALIFIER T dot(qua<T, Q> const& x, qua<T, Q> const& y)
  5. {
  6. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
  7. return detail::compute_dot<qua<T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);
  8. }
  9. template<typename T, qualifier Q>
  10. GLM_FUNC_QUALIFIER T length(qua<T, Q> const& q)
  11. {
  12. return glm::sqrt(dot(q, q));
  13. }
  14. template<typename T, qualifier Q>
  15. GLM_FUNC_QUALIFIER qua<T, Q> normalize(qua<T, Q> const& q)
  16. {
  17. T len = length(q);
  18. if(len <= static_cast<T>(0)) // Problem
  19. return qua<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0));
  20. T oneOverLen = static_cast<T>(1) / len;
  21. return qua<T, Q>(q.w * oneOverLen, q.x * oneOverLen, q.y * oneOverLen, q.z * oneOverLen);
  22. }
  23. template<typename T, qualifier Q>
  24. GLM_FUNC_QUALIFIER qua<T, Q> cross(qua<T, Q> const& q1, qua<T, Q> const& q2)
  25. {
  26. return qua<T, Q>(
  27. q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z,
  28. q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,
  29. q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z,
  30. q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x);
  31. }
  32. }//namespace glm