math_helper.hpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #ifndef DEPTHGUIDE_MATH_HELPER_HPP
  2. #define DEPTHGUIDE_MATH_HELPER_HPP
  3. #include <glm/glm.hpp>
  4. #include <glm/gtc/quaternion.hpp>
  5. #include <glm/gtx/transform.hpp>
  6. #include <Eigen/Geometry>
  7. // r in radius
  8. inline glm::mat4 to_transform_mat(glm::vec3 t, glm::vec3 r) {
  9. static constexpr auto unit_x = glm::vec3(1.0f, 0.0f, 0.0f);
  10. static constexpr auto unit_y = glm::vec3(0.0f, 1.0f, 0.0f);
  11. static constexpr auto unit_z = glm::vec3(0.0f, 0.0f, 1.0f);
  12. auto rot = glm::angleAxis(r.x, unit_x)
  13. * glm::angleAxis(r.y, unit_y)
  14. * glm::angleAxis(r.z, unit_z);
  15. auto offset = glm::translate(t);
  16. return offset * glm::mat4_cast(rot);
  17. }
  18. inline glm::mat4 to_transform_mat(glm::vec3 t, glm::mat3 r) {
  19. auto ret = glm::mat4(r);
  20. ret[3] = glm::vec4(t, 1.f);
  21. return ret;
  22. }
  23. template<typename Scalar, int Mode>
  24. inline glm::mat4 to_mat4(const Eigen::Transform<Scalar, 3, Mode> &m) {
  25. auto ret = glm::mat4();
  26. auto &mat = m.matrix();
  27. for (auto j = 0; j < 4; ++j)
  28. for (auto i = 0; i < 4; ++i) {
  29. ret[j][i] = mat(i, j);
  30. }
  31. return ret;
  32. }
  33. template<typename Scalar, int Mode>
  34. inline auto to_eigen_transform(const glm::mat4 &m) {
  35. auto ret = Eigen::Transform<Scalar, 3, Mode>();
  36. auto &mat = ret.matrix();
  37. for (auto j = 0; j < 4; ++j)
  38. for (auto i = 0; i < 4; ++i) {
  39. mat(i, j) = m[j][i];
  40. }
  41. return ret;
  42. }
  43. template<typename Scalar, int Mode>
  44. inline void to_eigen_transform(const glm::mat4 &m,
  45. Eigen::Transform<Scalar, 3, Mode> &ret) {
  46. ret = to_eigen_transform<Scalar, Mode>(m);
  47. }
  48. template<typename T>
  49. concept Vec2Type = requires(T t) {
  50. { t.x } -> std::convertible_to<float>;
  51. { t.y } -> std::convertible_to<float>;
  52. };
  53. template<Vec2Type T>
  54. inline auto to_vec2(const T &v) {
  55. return glm::vec2(v.x, v.y);
  56. }
  57. template<typename T>
  58. concept Vec3Type = requires(T t) {
  59. { t.x } -> std::convertible_to<float>;
  60. { t.y } -> std::convertible_to<float>;
  61. { t.z } -> std::convertible_to<float>;
  62. };
  63. template<Vec3Type T>
  64. inline auto to_vec3(const T &v) {
  65. return glm::vec3(v.x, v.y, v.z);
  66. }
  67. inline auto to_homo(const glm::vec3 &v) {
  68. return glm::vec4(v, 1.f);
  69. }
  70. inline auto to_homo(const glm::vec2 &v) {
  71. return glm::vec3(v, 1.f);
  72. }
  73. inline auto from_homo(const glm::vec4 &v) {
  74. return glm::vec3(v) / v.w;
  75. }
  76. inline auto from_homo(const glm::vec3 &v) {
  77. return glm::vec2(v) / v.z;
  78. }
  79. // transform point
  80. inline glm::vec3 transform_p(const glm::mat4 &mat, const glm::vec3 &point) {
  81. return from_homo(mat * to_homo(point));
  82. }
  83. inline glm::vec2 transform_p(const glm::mat3 &mat, const glm::vec2 &point) {
  84. return from_homo(mat * to_homo(point));
  85. }
  86. // transform vector
  87. inline glm::vec3 transform_v(const glm::mat4 &mat, const glm::vec3 &vec) {
  88. return glm::mat3(mat) * vec;
  89. }
  90. #endif //DEPTHGUIDE_MATH_HELPER_HPP