euler_to_quat_lh.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Copyright (c), Recep Aslantas.
  3. *
  4. * MIT License (MIT), http://opensource.org/licenses/MIT
  5. * Full license can be found in the LICENSE file
  6. */
  7. /*
  8. Functions:
  9. CGLM_INLINE void glm_euler_xyz_quat_lh(vec3 angles, versor dest);
  10. CGLM_INLINE void glm_euler_xzy_quat_lh(vec3 angles, versor dest);
  11. CGLM_INLINE void glm_euler_yxz_quat_lh(vec3 angles, versor dest);
  12. CGLM_INLINE void glm_euler_yzx_quat_lh(vec3 angles, versor dest);
  13. CGLM_INLINE void glm_euler_zxy_quat_lh(vec3 angles, versor dest);
  14. CGLM_INLINE void glm_euler_zyx_quat_lh(vec3 angles, versor dest);
  15. */
  16. /*
  17. Things to note:
  18. The only difference between euler to quat rh vs lh is that the zsin part is negative
  19. */
  20. #ifndef cglm_euler_to_quat_lh_h
  21. #define cglm_euler_to_quat_lh_h
  22. #include "../common.h"
  23. /*!
  24. * @brief creates NEW quaternion using rotation angles and does
  25. * rotations in x y z order in left hand (roll pitch yaw)
  26. *
  27. * @param[in] angles angles x y z (radians)
  28. * @param[out] dest quaternion
  29. */
  30. CGLM_INLINE
  31. void
  32. glm_euler_xyz_quat_lh(vec3 angles, versor dest) {
  33. float xc, yc, zc,
  34. xs, ys, zs;
  35. xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
  36. ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
  37. zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
  38. dest[0] = xc * ys * zs + xs * yc * zc;
  39. dest[1] = xc * ys * zc - xs * yc * zs;
  40. dest[2] = xc * yc * zs + xs * ys * zc;
  41. dest[3] = xc * yc * zc - xs * ys * zs;
  42. }
  43. /*!
  44. * @brief creates NEW quaternion using rotation angles and does
  45. * rotations in x z y order in left hand (roll yaw pitch)
  46. *
  47. * @param[in] angles angles x y z (radians)
  48. * @param[out] dest quaternion
  49. */
  50. CGLM_INLINE
  51. void
  52. glm_euler_xzy_quat_lh(vec3 angles, versor dest) {
  53. float xc, yc, zc,
  54. xs, ys, zs;
  55. xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
  56. ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
  57. zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
  58. dest[0] = -xc * zs * ys + xs * zc * yc;
  59. dest[1] = xc * zc * ys - xs * zs * yc;
  60. dest[2] = xc * zs * yc + xs * zc * ys;
  61. dest[3] = xc * zc * yc + xs * zs * ys;
  62. }
  63. /*!
  64. * @brief creates NEW quaternion using rotation angles and does
  65. * rotations in y x z order in left hand (pitch roll yaw)
  66. *
  67. * @param[in] angles angles x y z (radians)
  68. * @param[out] dest quaternion
  69. */
  70. CGLM_INLINE
  71. void
  72. glm_euler_yxz_quat_lh(vec3 angles, versor dest) {
  73. float xc, yc, zc,
  74. xs, ys, zs;
  75. xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
  76. ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
  77. zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
  78. dest[0] = yc * xs * zc + ys * xc * zs;
  79. dest[1] = -yc * xs * zs + ys * xc * zc;
  80. dest[2] = yc * xc * zs - ys * xs * zc;
  81. dest[3] = yc * xc * zc + ys * xs * zs;
  82. }
  83. /*!
  84. * @brief creates NEW quaternion using rotation angles and does
  85. * rotations in y z x order in left hand (pitch yaw roll)
  86. *
  87. * @param[in] angles angles x y z (radians)
  88. * @param[out] dest quaternion
  89. */
  90. CGLM_INLINE
  91. void
  92. glm_euler_yzx_quat_lh(vec3 angles, versor dest) {
  93. float xc, yc, zc,
  94. xs, ys, zs;
  95. xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
  96. ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
  97. zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
  98. dest[0] = yc * zc * xs + ys * zs * xc;
  99. dest[1] = yc * zs * xs + ys * zc * xc;
  100. dest[2] = yc * zs * xc - ys * zc * xs;
  101. dest[3] = yc * zc * xc - ys * zs * xs;
  102. }
  103. /*!
  104. * @brief creates NEW quaternion using rotation angles and does
  105. * rotations in z x y order in left hand (yaw roll pitch)
  106. *
  107. * @param[in] angles angles x y z (radians)
  108. * @param[out] dest quaternion
  109. */
  110. CGLM_INLINE
  111. void
  112. glm_euler_zxy_quat_lh(vec3 angles, versor dest) {
  113. float xc, yc, zc,
  114. xs, ys, zs;
  115. xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
  116. ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
  117. zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
  118. dest[0] = zc * xs * yc - zs * xc * ys;
  119. dest[1] = zc * xc * ys + zs * xs * yc;
  120. dest[2] = zc * xs * ys + zs * xc * yc;
  121. dest[3] = zc * xc * yc - zs * xs * ys;
  122. }
  123. /*!
  124. * @brief creates NEW quaternion using rotation angles and does
  125. * rotations in z y x order in left hand (yaw pitch roll)
  126. *
  127. * @param[in] angles angles x y z (radians)
  128. * @param[out] dest quaternion
  129. */
  130. CGLM_INLINE
  131. void
  132. glm_euler_zyx_quat_lh(vec3 angles, versor dest) {
  133. float xc, yc, zc,
  134. xs, ys, zs;
  135. xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
  136. ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
  137. zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
  138. dest[0] = zc * yc * xs - zs * ys * xc;
  139. dest[1] = zc * ys * xc + zs * yc * xs;
  140. dest[2] = -zc * ys * xs + zs * yc * xc;
  141. dest[3] = zc * yc * xc + zs * ys * xs;
  142. }
  143. #endif /*cglm_euler_to_quat_lh_h*/