ENH:add 3 isometric camera views

jira: none
Change-Id: I94afe60a0066df95410bd40f06511a962cd696a9
This commit is contained in:
zhou.xu 2025-04-13 17:33:27 +08:00 committed by lane.wei
parent ec3d5e8151
commit 53959cf579
5 changed files with 63 additions and 27 deletions

View File

@ -87,6 +87,12 @@ void Camera::select_view(const std::string& direction)
{
if (direction == "iso")
set_iso_orientation();
else if (direction == "iso_1")
set_iso_orientation(ViewAngleType::Iso_1);
else if (direction == "iso_2")
set_iso_orientation(ViewAngleType::Iso_2);
else if (direction == "iso_3")
set_iso_orientation(ViewAngleType::Iso_3);
else if (direction == "left")
look_at(m_target - m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ());
else if (direction == "right")
@ -99,11 +105,8 @@ void Camera::select_view(const std::string& direction)
look_at(m_target - m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ());
else if (direction == "rear")
look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ());
else if (direction == "topfront")
else if (direction == "topfront" || "plate")
look_at(m_target - 0.707 * m_distance * Vec3d::UnitY() + 0.707 * m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY() + Vec3d::UnitZ());
else if (direction == "plate") {
look_at(m_target - 0.707 * m_distance * Vec3d::UnitY() + 0.707 * m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY() + Vec3d::UnitZ());
}
}
void Camera::select_view(ViewAngleType type)
{
@ -112,6 +115,18 @@ void Camera::select_view(ViewAngleType type)
select_view("iso");
break;
}
case Slic3r::GUI::Camera::ViewAngleType::Iso_1: {
select_view("iso_1");
break;
}
case Slic3r::GUI::Camera::ViewAngleType::Iso_2: {
select_view("iso_2");
break;
}
case Slic3r::GUI::Camera::ViewAngleType::Iso_3: {
select_view("iso_3");
break;
}
case Slic3r::GUI::Camera::ViewAngleType::Top_Front: {
select_view("topfront");
break;
@ -746,28 +761,30 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up
void Camera::set_default_orientation()
{
// BBS modify default orientation
look_at(m_target - 0.707 * m_distance * Vec3d::UnitY() + 0.707 * m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY() + Vec3d::UnitZ());
/*m_zenit = 45.0f;
const double theta_rad = Geometry::deg2rad(-(double)m_zenit);
const double phi_rad = Geometry::deg2rad(45.0);
const double sin_theta = ::sin(theta_rad);
const Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad));
m_view_rotation = Eigen::AngleAxisd(theta_rad, Vec3d::UnitX()) * Eigen::AngleAxisd(phi_rad, Vec3d::UnitZ());
m_view_rotation.normalize();
m_view_matrix.fromPositionOrientationScale(m_view_rotation * (-camera_pos), m_view_rotation, Vec3d::Ones());*/
select_view("topfront");
}
void Camera::set_iso_orientation()
void Camera::set_iso_orientation(ViewAngleType va_type)
{
m_zenit = 45.0f;
const double theta_rad = Geometry::deg2rad(-(double)m_zenit);
const double phi_rad = Geometry::deg2rad(45.0);
const double sin_theta = ::sin(theta_rad);
const Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad));
m_view_rotation = Eigen::AngleAxisd(theta_rad, Vec3d::UnitX()) * Eigen::AngleAxisd(phi_rad, Vec3d::UnitZ());
if (!(va_type == ViewAngleType::Iso || va_type == ViewAngleType::Iso_1 || va_type == ViewAngleType::Iso_2 ||va_type == ViewAngleType::Iso_3)) {
return;
}
Vec3d dir = Vec3d(-0.5f, -0.5f, std::sqrt(2) / 2.f);
m_view_rotation = Eigen::AngleAxisd(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(45.0), Vec3d::UnitZ());
if (va_type == ViewAngleType::Iso_1) {
dir = Vec3d(-0.5f, 0.5f, std::sqrt(2) / 2.f);
m_view_rotation = Eigen::AngleAxisd(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(135.0), Vec3d::UnitZ());
} else if (va_type == ViewAngleType::Iso_2) {
dir = Vec3d(0.5f, 0.5f, std::sqrt(2) / 2.f);
m_view_rotation = Eigen::AngleAxisd(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(225.0), Vec3d::UnitZ());
} else if (va_type == ViewAngleType::Iso_3) {
dir = Vec3d(0.5f, -0.5f, std::sqrt(2) / 2.f);
m_view_rotation = Eigen::AngleAxisd(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(315.0), Vec3d::UnitZ());
}
m_view_rotation.normalize();
const Vec3d camera_pos = m_target + m_distance * dir;
m_view_matrix.fromPositionOrientationScale(m_view_rotation * (-camera_pos), m_view_rotation, Vec3d::Ones());
update_zenit();
}
@ -788,7 +805,8 @@ Vec3d Camera::validate_target(const Vec3d& target) const
void Camera::update_zenit()
{
m_zenit = Geometry::rad2deg(0.5 * M_PI - std::acos(std::clamp(-get_dir_forward().dot(Vec3d::UnitZ()), -1.0, 1.0))); }
m_zenit = Geometry::rad2deg(0.5 * M_PI - std::acos(std::clamp(-get_dir_forward().dot(Vec3d::UnitZ()), -1.0, 1.0)));
}
void Camera::update_target() {
Vec3d temptarget = get_position() + m_distance * get_dir_forward();

View File

@ -43,6 +43,9 @@ struct Camera
Rear,
Count_ViewAngleType,
Top_Plate,//for 3mf and Skip parts
Iso_1,//clockwise rotate 90 degrees on the basis of Iso
Iso_2,//clockwise rotate 180 degrees on the basis of Iso
Iso_3,//clockwise rotate 270 degrees on the basis of Iso
};
bool requires_zoom_to_bed{ false };
//BBS
@ -178,7 +181,7 @@ private:
void set_distance(double distance);
void set_default_orientation();
void set_iso_orientation();
void set_iso_orientation(ViewAngleType va_type = ViewAngleType::Iso);
Vec3d validate_target(const Vec3d& target) const;
void update_zenit();
void update_target();

View File

@ -3659,7 +3659,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
case '4': { select_view("rear"); break; }
case '5': { select_view("left"); break; }
case '6': { select_view("right"); break; }
case '7': { select_plate(); break; }
case '7': { select_view("iso");break; }
#ifdef __APPLE__
case 'k':
case 'K':
@ -4052,7 +4052,11 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
}
case '7':
case WXK_NUMPAD7: //7 on numpad
{ select_plate(); break; }
{
select_view("iso");
m_gizmos.update_paint_base_camera_rotate_rad();
break;
}
default: break;
}
}

View File

@ -247,8 +247,9 @@ void KBShortcutsDialog::fill_shortcuts()
{ctrl + "2", L("Camera view - Bottom")},
{ctrl + "3", L("Camera view - Front")},
{ctrl + "4", L("Camera view - Behind")},
{ctrl + "5", L("Camera Angle - Left side")},
{ctrl + "6", L("Camera Angle - Right side")},
{ctrl + "5", L("Camera view - Left")},
{ctrl + "6", L("Camera view - Right")},
{ctrl + "7", L("Camera view - Isometric")},
{ctrl + "A", L("Select all objects")},
{ctrl + L("Shift+D"), L("Delete all")},

View File

@ -2426,6 +2426,16 @@ static void add_common_view_menu_items(wxMenu* view_menu, MainFrame* mainFrame,
"", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Right", "Camera"), "Camera") + "\t" + ctrl + "6", _L("Right View"),[mainFrame](wxCommandEvent &) { mainFrame->select_view("right"); },
"", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Isometric", "Camera"), "Camera") + "\t" + ctrl + "7", _L("Isometric View"), [mainFrame](wxCommandEvent &) { mainFrame->select_view("iso"); }, "",
nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
#if !BBL_RELEASE_TO_PUBLIC
append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Isometric 1", "Camera"), "Camera"), _L("Isometric 1 View"),
[mainFrame](wxCommandEvent &) { mainFrame->select_view("iso_1"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Isometric 2", "Camera"), "Camera"), _L("Isometric 2 View"),
[mainFrame](wxCommandEvent &) { mainFrame->select_view("iso_2"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
append_menu_item(view_menu, wxID_ANY, _CTX(L_CONTEXT("Isometric 3", "Camera"), "Camera"), _L("Isometric 3 View"),
[mainFrame](wxCommandEvent &) { mainFrame->select_view("iso_3"); }, "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
#endif
}
void MainFrame::init_menubar_as_editor()