axis_angle.h 661 B

123456789101112131415161718192021222324252627282930
  1. #pragma once
  2. #include "helpler_funtions.h"
  3. #include "math.h"
  4. /**
  5. * @brief 使用四元数构造轴角向量
  6. *
  7. * @param Q 四元数
  8. * @param axisAngle 轴角
  9. */
  10. static inline void AxisAngle_ByQuaternion(const float Q[4], float axisAngle[3])
  11. {
  12. float q_imag[3] = {Q[1], Q[2], Q[3]};
  13. float q_imag_mag = sqrtf(q_imag[0] * q_imag[0] + q_imag[1] * q_imag[1] +
  14. q_imag[2] * q_imag[2]);
  15. float r;
  16. if (q_imag_mag > 1e-10)
  17. {
  18. r = 2 * atan2f(q_imag_mag, Q[0]) / q_imag_mag;
  19. }
  20. else
  21. {
  22. r = 2 * sign(Q[0]);
  23. }
  24. for (int i = 0; i < 3; ++i)
  25. {
  26. axisAngle[i] = r * q_imag[i];
  27. }
  28. }