From 08bd21310cc3c774b11a1a6c27a540358cad999f Mon Sep 17 00:00:00 2001 From: Valerii Bokhan <80919135+valerii-bokhan@users.noreply.github.com> Date: Sun, 9 Nov 2025 05:29:27 +0100 Subject: [PATCH] Fix: Correcting the behavior of the camera panning. (#11111) * Fix: Correcting the behavior of the camera panning. Fixes #11107 --- src/slic3r/GUI/GLCanvas3D.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 02db33574e..9ff422f724 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -33,6 +33,7 @@ #include "DailyTips.hpp" #include "FilamentMapDialog.hpp" +#include "slic3r/GUI/CameraUtils.hpp" #include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp" #include "slic3r/Utils/UndoRedo.hpp" #include "slic3r/Utils/MacDarkMode.hpp" @@ -4690,6 +4691,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_camera_movement = true; m_mouse.drag.start_position_2D = pos; + m_mouse.drag.move_start_threshold_position_2D = pos; } } else if ((evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) || @@ -9372,12 +9374,18 @@ Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) if (m_canvas == nullptr) return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); + const Camera& camera = wxGetApp().plater()->get_camera(); + if (z == nullptr) { - const SceneRaycaster::HitResult hit = m_scene_raycaster.hit(mouse_pos.cast(), wxGetApp().plater()->get_camera(), nullptr); + const SceneRaycaster::HitResult hit = m_scene_raycaster.hit(mouse_pos.cast(), camera, nullptr); return hit.is_valid() ? hit.position.cast() : _mouse_to_bed_3d(mouse_pos); } + // Orca: Handling of the particular case, if we want to get the position for Z = 0 + else if (is_approx(static_cast(*z), 0.)) { + Vec2d position = CameraUtils::get_z0_position(camera, Vec2d(mouse_pos.x(), mouse_pos.y())); + return Vec3d(position.x(), position.y(), *z); + } else { - const Camera& camera = wxGetApp().plater()->get_camera(); const Vec4i32 viewport(camera.get_viewport().data()); Vec3d out; igl::unproject(Vec3d(mouse_pos.x(), viewport[3] - mouse_pos.y(), *z), camera.get_view_matrix().matrix(), camera.get_projection_matrix().matrix(), viewport, out);