mirror of
https://git.mirrors.martin98.com/https://github.com/bambulab/BambuStudio.git
synced 2025-08-11 17:49:00 +08:00
ENH:add 3 isometric camera views
jira: none Change-Id: I94afe60a0066df95410bd40f06511a962cd696a9
This commit is contained in:
parent
ec3d5e8151
commit
53959cf579
@ -87,6 +87,12 @@ void Camera::select_view(const std::string& direction)
|
|||||||
{
|
{
|
||||||
if (direction == "iso")
|
if (direction == "iso")
|
||||||
set_iso_orientation();
|
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")
|
else if (direction == "left")
|
||||||
look_at(m_target - m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ());
|
look_at(m_target - m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ());
|
||||||
else if (direction == "right")
|
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());
|
look_at(m_target - m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ());
|
||||||
else if (direction == "rear")
|
else if (direction == "rear")
|
||||||
look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ());
|
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());
|
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)
|
void Camera::select_view(ViewAngleType type)
|
||||||
{
|
{
|
||||||
@ -112,6 +115,18 @@ void Camera::select_view(ViewAngleType type)
|
|||||||
select_view("iso");
|
select_view("iso");
|
||||||
break;
|
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: {
|
case Slic3r::GUI::Camera::ViewAngleType::Top_Front: {
|
||||||
select_view("topfront");
|
select_view("topfront");
|
||||||
break;
|
break;
|
||||||
@ -746,28 +761,30 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up
|
|||||||
void Camera::set_default_orientation()
|
void Camera::set_default_orientation()
|
||||||
{
|
{
|
||||||
// BBS modify 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());
|
select_view("topfront");
|
||||||
|
|
||||||
/*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());*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::set_iso_orientation()
|
void Camera::set_iso_orientation(ViewAngleType va_type)
|
||||||
{
|
{
|
||||||
m_zenit = 45.0f;
|
if (!(va_type == ViewAngleType::Iso || va_type == ViewAngleType::Iso_1 || va_type == ViewAngleType::Iso_2 ||va_type == ViewAngleType::Iso_3)) {
|
||||||
const double theta_rad = Geometry::deg2rad(-(double)m_zenit);
|
return;
|
||||||
const double phi_rad = Geometry::deg2rad(45.0);
|
}
|
||||||
const double sin_theta = ::sin(theta_rad);
|
Vec3d dir = Vec3d(-0.5f, -0.5f, std::sqrt(2) / 2.f);
|
||||||
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(Geometry::deg2rad(-45.0), Vec3d::UnitX()) * Eigen::AngleAxisd(Geometry::deg2rad(45.0), Vec3d::UnitZ());
|
||||||
m_view_rotation = Eigen::AngleAxisd(theta_rad, Vec3d::UnitX()) * Eigen::AngleAxisd(phi_rad, 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();
|
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());
|
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()
|
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() {
|
void Camera::update_target() {
|
||||||
Vec3d temptarget = get_position() + m_distance * get_dir_forward();
|
Vec3d temptarget = get_position() + m_distance * get_dir_forward();
|
||||||
|
@ -43,6 +43,9 @@ struct Camera
|
|||||||
Rear,
|
Rear,
|
||||||
Count_ViewAngleType,
|
Count_ViewAngleType,
|
||||||
Top_Plate,//for 3mf and Skip parts
|
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 };
|
bool requires_zoom_to_bed{ false };
|
||||||
//BBS
|
//BBS
|
||||||
@ -178,7 +181,7 @@ private:
|
|||||||
void set_distance(double distance);
|
void set_distance(double distance);
|
||||||
|
|
||||||
void set_default_orientation();
|
void set_default_orientation();
|
||||||
void set_iso_orientation();
|
void set_iso_orientation(ViewAngleType va_type = ViewAngleType::Iso);
|
||||||
Vec3d validate_target(const Vec3d& target) const;
|
Vec3d validate_target(const Vec3d& target) const;
|
||||||
void update_zenit();
|
void update_zenit();
|
||||||
void update_target();
|
void update_target();
|
||||||
|
@ -3659,7 +3659,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
|
|||||||
case '4': { select_view("rear"); break; }
|
case '4': { select_view("rear"); break; }
|
||||||
case '5': { select_view("left"); break; }
|
case '5': { select_view("left"); break; }
|
||||||
case '6': { select_view("right"); break; }
|
case '6': { select_view("right"); break; }
|
||||||
case '7': { select_plate(); break; }
|
case '7': { select_view("iso");break; }
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'K':
|
case 'K':
|
||||||
@ -4052,7 +4052,11 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
|
|||||||
}
|
}
|
||||||
case '7':
|
case '7':
|
||||||
case WXK_NUMPAD7: //7 on numpad
|
case WXK_NUMPAD7: //7 on numpad
|
||||||
{ select_plate(); break; }
|
{
|
||||||
|
select_view("iso");
|
||||||
|
m_gizmos.update_paint_base_camera_rotate_rad();
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -247,8 +247,9 @@ void KBShortcutsDialog::fill_shortcuts()
|
|||||||
{ctrl + "2", L("Camera view - Bottom")},
|
{ctrl + "2", L("Camera view - Bottom")},
|
||||||
{ctrl + "3", L("Camera view - Front")},
|
{ctrl + "3", L("Camera view - Front")},
|
||||||
{ctrl + "4", L("Camera view - Behind")},
|
{ctrl + "4", L("Camera view - Behind")},
|
||||||
{ctrl + "5", L("Camera Angle - Left side")},
|
{ctrl + "5", L("Camera view - Left")},
|
||||||
{ctrl + "6", L("Camera Angle - Right side")},
|
{ctrl + "6", L("Camera view - Right")},
|
||||||
|
{ctrl + "7", L("Camera view - Isometric")},
|
||||||
|
|
||||||
{ctrl + "A", L("Select all objects")},
|
{ctrl + "A", L("Select all objects")},
|
||||||
{ctrl + L("Shift+D"), L("Delete all")},
|
{ctrl + L("Shift+D"), L("Delete all")},
|
||||||
|
@ -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);
|
"", 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"); },
|
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);
|
"", 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()
|
void MainFrame::init_menubar_as_editor()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user