gui: fix zoom-to-mouse (#4844)

gui: fix zoom-to-mouse

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.
This commit is contained in:
Dima Buzdyk 2024-04-14 14:49:44 +05:00 committed by GitHub
parent b0abb4c5a6
commit 5d45770745
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -3693,9 +3693,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);