From 8446eff59c2b57244cf477e5fe5036734bbed075 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 2 Feb 2023 10:58:48 +0100 Subject: [PATCH] Method Transformation::reset_skew() modified to use SVD decomposition of transformation matrix --- src/libslic3r/Geometry.cpp | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index 08f433c9a7..ec37766473 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -722,26 +722,15 @@ void Transformation::reset() #if ENABLE_WORLD_COORDINATE void Transformation::reset_skew() { - Matrix3d rotation; - Matrix3d scale; - m_matrix.computeRotationScaling(&rotation, &scale); + auto new_scale_factor = [](const Matrix3d& s) { +// return s.determinant(); // scale determinant + return (s(0, 0) + s(1, 1) + s(2, 2)) / 3.0; // scale average +// return std::max(s(0, 0), std::max(s(1, 1), s(2, 2))); // max scale +// return std::min(s(0, 0), std::min(s(1, 1), s(2, 2))); // min scale + }; - const double average_scale = std::cbrt(scale(0, 0) * scale(1, 1) * scale(2, 2)); - - scale(0, 0) = is_left_handed() ? -average_scale : average_scale; - scale(1, 1) = average_scale; - scale(2, 2) = average_scale; - - scale(0, 1) = 0.0; - scale(0, 2) = 0.0; - scale(1, 0) = 0.0; - scale(1, 2) = 0.0; - scale(2, 0) = 0.0; - scale(2, 1) = 0.0; - - const Vec3d offset = get_offset(); - m_matrix = rotation * scale; - m_matrix.translation() = offset; + const Geometry::TransformationSVD svd(*this); + m_matrix = get_offset_matrix() * Transform3d(svd.u) * scale_transform(new_scale_factor(svd.s)) * Transform3d(svd.v.transpose()); } Transform3d Transformation::get_matrix_no_offset() const