diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index 8faa49ea0..bb97f323f 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -1181,6 +1181,61 @@ Transform3d assemble_transform(const Vec3d& translation, const Vec3d& rotation, Vec3d extract_euler_angles(const Eigen::Matrix& rotation_matrix) { +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#if ENABLE_NEW_EULER_ANGLES + bool x_only = (rotation_matrix(0, 0) == 1.0) && (rotation_matrix(0, 1) == 0.0) && (rotation_matrix(0, 2) == 0.0) && (rotation_matrix(1, 0) == 0.0) && (rotation_matrix(2, 0) == 0.0); + bool y_only = (rotation_matrix(0, 1) == 0.0) && (rotation_matrix(1, 0) == 0.0) && (rotation_matrix(1, 1) == 1.0) && (rotation_matrix(1, 2) == 0.0) && (rotation_matrix(2, 1) == 0.0); + bool z_only = (rotation_matrix(0, 2) == 0.0) && (rotation_matrix(1, 2) == 0.0) && (rotation_matrix(2, 0) == 0.0) && (rotation_matrix(2, 1) == 0.0) && (rotation_matrix(2, 2) == 1.0); +// bool xy_only = (rotation_matrix(0, 1) == 0.0); // Rx * Ry + bool yx_only = (rotation_matrix(1, 0) == 0.0); // Ry * Rx +// bool xz_only = (rotation_matrix(0, 2) == 0.0); // Rx * Rz +// bool zx_only = (rotation_matrix(2, 0) == 0.0); // Rz * Rx +// bool yz_only = (rotation_matrix(1, 2) == 0.0); // Ry * Rz +// bool zy_only = (rotation_matrix(2, 1) == 0.0); // Rz * Ry + + Vec3d angles = Vec3d::Zero(); + if (x_only || y_only || z_only) + { + angles = rotation_matrix.eulerAngles(0, 1, 2); + if (x_only && (std::abs(angles(1)) == (double)PI) && (std::abs(angles(2)) == (double)PI)) + { + angles(0) -= (double)PI; + angles(1) = 0.0; + angles(2) = 0.0; + } + } + else + { + double cy_abs = ::sqrt(sqr(rotation_matrix(0, 0)) + sqr(rotation_matrix(1, 0))); + angles(0) = ::atan2(rotation_matrix(2, 1), rotation_matrix(2, 2)); + angles(1) = ::atan2(-rotation_matrix(2, 0), cy_abs); + angles(2) = ::atan2(rotation_matrix(1, 0), rotation_matrix(0, 0)); + if (yx_only && (angles(2) == (double)PI)) + { + angles(0) -= (double)PI; + angles(1) = (double)PI - angles(1); + angles(2) = 0.0; + } + } + + // debug check + Geometry::Transformation t; + t.set_rotation(angles); + if (!t.get_matrix().matrix().block(0, 0, 3, 3).isApprox(rotation_matrix)) + { + std::cout << "something went wrong in extracting euler angles from matrix" << std::endl; + +// Eigen::Matrix m = t.get_matrix().matrix().block(0, 0, 3, 3); +// for (int r = 0; r < 3; ++r) +// { +// for (int c = 0; c < 3; ++c) +// { +// std::cout << r << ", " << c << ": " << m(r, c) << " - " << rotation_matrix(r, c) << std::endl; +// } +// } + } +#else +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ auto y_only = [](const Eigen::Matrix& matrix) -> bool { return (matrix(0, 1) == 0.0) && (matrix(1, 0) == 0.0) && (matrix(1, 1) == 1.0) && (matrix(1, 2) == 0.0) && (matrix(2, 1) == 0.0); }; @@ -1210,6 +1265,9 @@ Vec3d extract_euler_angles(const Eigen::Matrix& angles(1) = ::atan2(-rotation_matrix(2, 0), cy_abs); angles(2) = (angles(1) >= 0.0) ? ::atan2(rotation_matrix(1, 2), rotation_matrix(1, 1)) : ::atan2(-rotation_matrix(1, 2), rotation_matrix(1, 1)); } +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#endif // ENABLE_NEW_EULER_ANGLES +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ return angles; } diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index bab7f3b73..256c6feb0 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -49,3 +49,12 @@ #endif // _technologies_h_ +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +//==================== +// 1.42.0.alpha3 techs +//==================== +#define ENABLE_1_42_0_ALPHA3 1 + +// Changed algorithm to extract euler angles from rotation matrix +#define ENABLE_NEW_EULER_ANGLES (1 && ENABLE_1_42_0_ALPHA3) +//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@