euler.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. NOTE:
  9. angles must be passed as [X-Angle, Y-Angle, Z-angle] order
  10. For instance you don't pass angles as [Z-Angle, X-Angle, Y-angle] to
  11. glm_euler_zxy function, All RELATED functions accept angles same order
  12. which is [X, Y, Z].
  13. */
  14. /*
  15. Types:
  16. enum glm_euler_seq
  17. Functions:
  18. CGLM_INLINE vec3s glms_euler_angles(mat4s m)
  19. CGLM_INLINE mat4s glms_euler_xyz(vec3s angles)
  20. CGLM_INLINE mat4s glms_euler_xzy(vec3s angles)
  21. CGLM_INLINE mat4s glms_euler_yxz(vec3s angles)
  22. CGLM_INLINE mat4s glms_euler_yzx(vec3s angles)
  23. CGLM_INLINE mat4s glms_euler_zxy(vec3s angles)
  24. CGLM_INLINE mat4s glms_euler_zyx(vec3s angles)
  25. CGLM_INLINE mat4s glms_euler_by_order(vec3s angles, glm_euler_seq ord)
  26. CGLM_INLINE versors glms_euler_xyz_quat(vec3s angles)
  27. CGLM_INLINE versors glms_euler_xzy_quat(vec3s angles)
  28. CGLM_INLINE versors glms_euler_yxz_quat(vec3s angles)
  29. CGLM_INLINE versors glms_euler_yzx_quat(vec3s angles)
  30. CGLM_INLINE versors glms_euler_zxy_quat(vec3s angles)
  31. CGLM_INLINE versors glms_euler_zyx_quat(vec3s angles)
  32. */
  33. #ifndef cglms_euler_h
  34. #define cglms_euler_h
  35. #include "../common.h"
  36. #include "../types-struct.h"
  37. #include "../euler.h"
  38. /*!
  39. * @brief extract euler angles (in radians) using xyz order
  40. *
  41. * @param[in] m affine transform
  42. * @returns angles vector [x, y, z]
  43. */
  44. CGLM_INLINE
  45. vec3s
  46. glms_euler_angles(mat4s m) {
  47. vec3s dest;
  48. glm_euler_angles(m.raw, dest.raw);
  49. return dest;
  50. }
  51. /*!
  52. * @brief build rotation matrix from euler angles
  53. *
  54. * @param[in] angles angles as vector [Xangle, Yangle, Zangle]
  55. * @returns rotation matrix
  56. */
  57. CGLM_INLINE
  58. mat4s
  59. glms_euler_xyz(vec3s angles) {
  60. mat4s dest;
  61. glm_euler_xyz(angles.raw, dest.raw);
  62. return dest;
  63. }
  64. /*!
  65. * @brief build rotation matrix from euler angles
  66. *
  67. * @param[in] angles angles as vector [Xangle, Yangle, Zangle]
  68. * @returns rotation matrix
  69. */
  70. CGLM_INLINE
  71. mat4s
  72. glms_euler_xzy(vec3s angles) {
  73. mat4s dest;
  74. glm_euler_xzy(angles.raw, dest.raw);
  75. return dest;
  76. }
  77. /*!
  78. * @brief build rotation matrix from euler angles
  79. *
  80. * @param[in] angles angles as vector [Xangle, Yangle, Zangle]
  81. * @returns rotation matrix
  82. */
  83. CGLM_INLINE
  84. mat4s
  85. glms_euler_yxz(vec3s angles) {
  86. mat4s dest;
  87. glm_euler_yxz(angles.raw, dest.raw);
  88. return dest;
  89. }
  90. /*!
  91. * @brief build rotation matrix from euler angles
  92. *
  93. * @param[in] angles angles as vector [Xangle, Yangle, Zangle]
  94. * @returns rotation matrix
  95. */
  96. CGLM_INLINE
  97. mat4s
  98. glms_euler_yzx(vec3s angles) {
  99. mat4s dest;
  100. glm_euler_yzx(angles.raw, dest.raw);
  101. return dest;
  102. }
  103. /*!
  104. * @brief build rotation matrix from euler angles
  105. *
  106. * @param[in] angles angles as vector [Xangle, Yangle, Zangle]
  107. * @returns rotation matrix
  108. */
  109. CGLM_INLINE
  110. mat4s
  111. glms_euler_zxy(vec3s angles) {
  112. mat4s dest;
  113. glm_euler_zxy(angles.raw, dest.raw);
  114. return dest;
  115. }
  116. /*!
  117. * @brief build rotation matrix from euler angles
  118. *
  119. * @param[in] angles angles as vector [Xangle, Yangle, Zangle]
  120. * @returns rotation matrix
  121. */
  122. CGLM_INLINE
  123. mat4s
  124. glms_euler_zyx(vec3s angles) {
  125. mat4s dest;
  126. glm_euler_zyx(angles.raw, dest.raw);
  127. return dest;
  128. }
  129. /*!
  130. * @brief build rotation matrix from euler angles
  131. *
  132. * @param[in] angles angles as vector [Xangle, Yangle, Zangle]
  133. * @param[in] ord euler order
  134. * @returns rotation matrix
  135. */
  136. CGLM_INLINE
  137. mat4s
  138. glms_euler_by_order(vec3s angles, glm_euler_seq ord) {
  139. mat4s dest;
  140. glm_euler_by_order(angles.raw, ord, dest.raw);
  141. return dest;
  142. }
  143. /*!
  144. * @brief creates NEW quaternion using rotation angles and does
  145. * rotations in x y z order (roll pitch yaw)
  146. *
  147. * @param[in] angles angles x y z (radians)
  148. * @returns quaternion
  149. */
  150. CGLM_INLINE
  151. versors
  152. glms_euler_xyz_quat(vec3s angles) {
  153. versors dest;
  154. glm_euler_xyz_quat(angles.raw, dest.raw);
  155. return dest;
  156. }
  157. /*!
  158. * @brief creates NEW quaternion using rotation angles and does
  159. * rotations in x z y order (roll yaw pitch)
  160. *
  161. * @param[in] angles angles x y z (radians)
  162. * @returns quaternion
  163. */
  164. CGLM_INLINE
  165. versors
  166. glms_euler_xzy_quat(vec3s angles) {
  167. versors dest;
  168. glm_euler_xzy_quat(angles.raw, dest.raw);
  169. return dest;
  170. }
  171. /*!
  172. * @brief creates NEW quaternion using rotation angles and does
  173. * rotations in y x z order (pitch roll yaw)
  174. *
  175. * @param[in] angles angles x y z (radians)
  176. * @returns quaternion
  177. */
  178. CGLM_INLINE
  179. versors
  180. glms_euler_yxz_quat(vec3s angles) {
  181. versors dest;
  182. glm_euler_yxz_quat(angles.raw, dest.raw);
  183. return dest;
  184. }
  185. /*!
  186. * @brief creates NEW quaternion using rotation angles and does
  187. * rotations in y z x order (pitch yaw roll)
  188. *
  189. * @param[in] angles angles x y z (radians)
  190. * @returns quaternion
  191. */
  192. CGLM_INLINE
  193. versors
  194. glms_euler_yzx_quat(vec3s angles) {
  195. versors dest;
  196. glm_euler_yzx_quat(angles.raw, dest.raw);
  197. return dest;
  198. }
  199. /*!
  200. * @brief creates NEW quaternion using rotation angles and does
  201. * rotations in z x y order (yaw roll pitch)
  202. *
  203. * @param[in] angles angles x y z (radians)
  204. * @returns quaternion
  205. */
  206. CGLM_INLINE
  207. versors
  208. glms_euler_zxy_quat(vec3s angles) {
  209. versors dest;
  210. glm_euler_zxy_quat(angles.raw, dest.raw);
  211. return dest;
  212. }
  213. /*!
  214. * @brief creates NEW quaternion using rotation angles and does
  215. * rotations in z y x order (yaw pitch roll)
  216. *
  217. * @param[in] angles angles x y z (radians)
  218. * @returns quaternion
  219. */
  220. CGLM_INLINE
  221. versors
  222. glms_euler_zyx_quat(vec3s angles) {
  223. versors dest;
  224. glm_euler_zyx_quat(angles.raw, dest.raw);
  225. return dest;
  226. }
  227. #endif /* cglms_euler_h */