ENH:update the camera's horizontal rotation radian

if the camera is already horizontal

jira: none
Change-Id: I45c88d0c394421e90404c8749192bb4bd7b6543b
This commit is contained in:
zhou.xu 2024-05-20 14:23:22 +08:00 committed by Lane.Wei
parent 473a86435f
commit 9eb08038b6
9 changed files with 58 additions and 11 deletions

View File

@ -333,6 +333,18 @@ void Camera::rotate_local_with_target(const Vec3d& rotation_rad, Vec3d target)
} }
} }
void Camera::calc_horizontal_rotate_rad(float &rotation_rad) {
if (is_looking_front()) {
auto right = get_dir_right();
auto temp_rotation_rad = acos(right.dot(Vec3d(1, 0, 0)));
auto value = Vec3d(1, 0, 0).cross(right);
if (value.z() > 0.01) {
temp_rotation_rad = -temp_rotation_rad;
}
rotation_rad = temp_rotation_rad;
}
}
// Virtual trackball, rotate around an axis, where the eucledian norm of the axis gives the rotation angle in radians. // Virtual trackball, rotate around an axis, where the eucledian norm of the axis gives the rotation angle in radians.
void Camera::rotate_local_around_target(const Vec3d& rotation_rad) void Camera::rotate_local_around_target(const Vec3d& rotation_rad)
{ {

View File

@ -128,7 +128,7 @@ public:
// BBS rotate the camera on a sphere having center == target // BBS rotate the camera on a sphere having center == target
void rotate_on_sphere_with_target(double delta_azimut_rad, double delta_zenit_rad, bool apply_limits, Vec3d target); void rotate_on_sphere_with_target(double delta_azimut_rad, double delta_zenit_rad, bool apply_limits, Vec3d target);
void rotate_local_with_target(const Vec3d& rotation_rad, Vec3d target); void rotate_local_with_target(const Vec3d& rotation_rad, Vec3d target);
void calc_horizontal_rotate_rad(float &rotation_rad);
// rotate the camera on a sphere having center == m_target and radius == m_distance // rotate the camera on a sphere having center == m_target and radius == m_distance
// using the given variations of spherical coordinates // using the given variations of spherical coordinates
// if apply_limits == true the camera stops rotating when its forward vector is parallel to the world Z axis // if apply_limits == true the camera stops rotating when its forward vector is parallel to the world Z axis

View File

@ -3569,16 +3569,32 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
{ select_view("bottom"); break; } { select_view("bottom"); break; }
case '3': case '3':
case WXK_NUMPAD3: //3 on numpad case WXK_NUMPAD3: //3 on numpad
{ select_view("front"); break; } {
select_view("front");
m_gizmos.update_paint_base_camera_rotate_rad();
break;
}
case '4': case '4':
case WXK_NUMPAD4: //4 on numpad case WXK_NUMPAD4: //4 on numpad
{ select_view("rear"); break; } {
select_view("rear");
m_gizmos.update_paint_base_camera_rotate_rad();
break;
}
case '5': case '5':
case WXK_NUMPAD5: //5 on numpad case WXK_NUMPAD5: //5 on numpad
{ select_view("left"); break; } {
select_view("left");
m_gizmos.update_paint_base_camera_rotate_rad();
break;
}
case '6': case '6':
case WXK_NUMPAD6: //6 on numpad case WXK_NUMPAD6: //6 on numpad
{ select_view("right"); break; } {
select_view("right");
m_gizmos.update_paint_base_camera_rotate_rad();
break;
}
case '7': case '7':
case WXK_NUMPAD7: //7 on numpad case WXK_NUMPAD7: //7 on numpad
{ select_plate(); break; } { select_plate(); break; }

View File

@ -764,6 +764,7 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott
if (m_vertical_only) { if (m_vertical_only) {
m_horizontal_only = false; m_horizontal_only = false;
m_is_front_view = true; m_is_front_view = true;
update_front_view_radian();
change_camera_view_angle(m_front_view_radian); change_camera_view_angle(m_front_view_radian);
} }
} }
@ -776,6 +777,7 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott
if (m_horizontal_only) { if (m_horizontal_only) {
m_vertical_only = false; m_vertical_only = false;
m_is_front_view = true; m_is_front_view = true;
update_front_view_radian();
change_camera_view_angle(m_front_view_radian); change_camera_view_angle(m_front_view_radian);
} }
} }
@ -785,12 +787,13 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott
if (m_is_front_view != is_front_view) { if (m_is_front_view != is_front_view) {
m_is_front_view = is_front_view; m_is_front_view = is_front_view;
if (m_is_front_view) { if (m_is_front_view) {
update_front_view_radian();
change_camera_view_angle(m_front_view_radian); change_camera_view_angle(m_front_view_radian);
} }
} }
m_imgui->disabled_begin(!m_is_front_view); m_imgui->disabled_begin(!m_is_front_view);
if (render_slider_double_input_by_format(slider_input_layout, _u8L("Rotate horizontally"), m_front_view_radian, 0.f, 360.f, 0, DoubleShowType::DEGREE)) { if (render_slider_double_input_by_format(slider_input_layout, _u8L("Rotate horizontally"), m_front_view_radian, -180.f, 180.f, 0, DoubleShowType::DEGREE)) {
change_camera_view_angle(m_front_view_radian); change_camera_view_angle(m_front_view_radian);
} }
m_imgui->disabled_end(); m_imgui->disabled_end();

View File

@ -70,6 +70,11 @@ GLGizmoPainterBase::ClippingPlaneDataWrapper GLGizmoPainterBase::get_clipping_pl
return clp_data_out; return clp_data_out;
} }
void GLGizmoPainterBase::update_front_view_radian()
{
wxGetApp().plater()->get_camera().calc_horizontal_rotate_rad(m_front_view_radian);
}
void GLGizmoPainterBase::render_triangles(const Selection& selection) const void GLGizmoPainterBase::render_triangles(const Selection& selection) const
{ {
auto* shader = wxGetApp().get_shader("gouraud"); auto* shader = wxGetApp().get_shader("gouraud");

View File

@ -235,6 +235,7 @@ public:
virtual const float get_cursor_height_min() const { return CursorHeightMin; } virtual const float get_cursor_height_min() const { return CursorHeightMin; }
virtual const float get_cursor_height_max() const { return CursorHeightMax; } virtual const float get_cursor_height_max() const { return CursorHeightMax; }
virtual const float get_cursor_height_step() const { return CursorHeightStep; } virtual const float get_cursor_height_step() const { return CursorHeightStep; }
void update_front_view_radian();
protected: protected:
virtual void render_triangles(const Selection& selection) const; virtual void render_triangles(const Selection& selection) const;

View File

@ -332,19 +332,21 @@ void GLGizmoSeam::on_render_input_window(float x, float y, float bottom_limit)
m_vertical_only = vertical_only; m_vertical_only = vertical_only;
if (m_vertical_only) { if (m_vertical_only) {
m_is_front_view = true; m_is_front_view = true;
update_front_view_radian();
change_camera_view_angle(m_front_view_radian); change_camera_view_angle(m_front_view_radian);
} }
} }
auto is_front_view = m_is_front_view; auto is_front_view = m_is_front_view;
m_imgui->bbl_checkbox(_L("View: keep horizontal"), is_front_view); m_imgui->bbl_checkbox(_L("View: keep horizontal"), is_front_view);
if (m_is_front_view != is_front_view) { if (m_is_front_view != is_front_view){
m_is_front_view = is_front_view; m_is_front_view = is_front_view;
if (m_is_front_view) { if (m_is_front_view) {
update_front_view_radian();
change_camera_view_angle(m_front_view_radian); change_camera_view_angle(m_front_view_radian);
} }
} }
m_imgui->disabled_begin(!m_is_front_view); m_imgui->disabled_begin(!m_is_front_view);
if (render_slider_double_input_by_format(slider_input_layout, _u8L("Rotate horizontally"), m_front_view_radian, 0.f, 360.f, 0, DoubleShowType::DEGREE)) { if (render_slider_double_input_by_format(slider_input_layout, _u8L("Rotate horizontally"), m_front_view_radian, -180.f, 180.f, 0, DoubleShowType::DEGREE)) {
change_camera_view_angle(m_front_view_radian); change_camera_view_angle(m_front_view_radian);
} }
m_imgui->disabled_end(); m_imgui->disabled_end();

View File

@ -607,6 +607,14 @@ void GLGizmosManager::finish_cut_rotation()
dynamic_cast<GLGizmoAdvancedCut*>(m_gizmos[Cut].get())->finish_rotation(); dynamic_cast<GLGizmoAdvancedCut*>(m_gizmos[Cut].get())->finish_rotation();
} }
void GLGizmosManager::update_paint_base_camera_rotate_rad()
{
if (m_current == MmuSegmentation || m_current == Seam) {
auto paint_gizmo = dynamic_cast<GLGizmoPainterBase*>(m_gizmos[m_current].get());
paint_gizmo->update_front_view_radian();
}
}
Vec3d GLGizmosManager::get_flattening_normal() const Vec3d GLGizmosManager::get_flattening_normal() const
{ {
if (!m_enabled || m_gizmos.empty()) if (!m_enabled || m_gizmos.empty())
@ -1370,7 +1378,7 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt)
// BBS // BBS
else if (m_current == MmuSegmentation) { else if (m_current == MmuSegmentation) {
GLGizmoMmuSegmentation* mmu_seg = dynamic_cast<GLGizmoMmuSegmentation*>(get_current()); GLGizmoMmuSegmentation* mmu_seg = dynamic_cast<GLGizmoMmuSegmentation*>(get_current());
if (mmu_seg != nullptr) { if (mmu_seg != nullptr && evt.ControlDown() == false) {
if (keyCode >= WXK_NUMPAD0 && keyCode <= WXK_NUMPAD9) { if (keyCode >= WXK_NUMPAD0 && keyCode <= WXK_NUMPAD9) {
keyCode = keyCode- WXK_NUMPAD0+'0'; keyCode = keyCode- WXK_NUMPAD0+'0';
} }

View File

@ -275,7 +275,7 @@ public:
else else
return nullptr; return nullptr;
} }
void update_paint_base_camera_rotate_rad();
Vec3d get_flattening_normal() const; Vec3d get_flattening_normal() const;
void set_flattening_data(const ModelObject* model_object); void set_flattening_data(const ModelObject* model_object);