Skip to content

Commit

Permalink
gui: fix zoom-to-mouse
Browse files Browse the repository at this point in the history
Plater disappeared when zoom-to-mouse enabled and user tries to zoom
with a side view enabled (Ctrl+<3..6>).

Mouse/screen center position estimation in 3D is made by calculating
intersection of a mouse vector which comes 'through' the screen with an
XY plane. However, when screen is parallel to Z axis, intersection point
located at infinite which results in infinite camera translation vector.

This change switches mouse position estimation to use of projection
matrix like its done for camera panning.
  • Loading branch information
buzzhuzz committed Apr 2, 2024
1 parent c663f43 commit f28c851
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/slic3r/GUI/GLCanvas3D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3696,9 +3696,11 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt)
}
else {
auto cnv_size = get_canvas_size();
auto screen_center_3d_pos = _mouse_to_3d({ cnv_size.get_width() * 0.5, cnv_size.get_height() * 0.5 });
auto mouse_3d_pos = _mouse_to_3d({evt.GetX(), evt.GetY()});
float z{0.f};
auto screen_center_3d_pos = _mouse_to_3d({ cnv_size.get_width() * 0.5, cnv_size.get_height() * 0.5 }, &z);
auto mouse_3d_pos = _mouse_to_3d({evt.GetX(), evt.GetY()}, &z);
Vec3d displacement = mouse_3d_pos - screen_center_3d_pos;

wxGetApp().plater()->get_camera().translate(displacement);
auto origin_zoom = wxGetApp().plater()->get_camera().get_zoom();
_update_camera_zoom(delta);
Expand Down

0 comments on commit f28c851

Please sign in to comment.