Preserve Z scale and apply correct offset when Ctrl‑dragging XY corner (#13840)

This commit is contained in:
Calcousin55
2026-06-01 00:16:06 +08:00
committed by GitHub
parent 30e83d790c
commit 86ad4d141a
+22
View File
@@ -448,9 +448,31 @@ void GLGizmoScale3D::do_scale_uniform(const UpdateData& data)
if (ratio > 0.0) if (ratio > 0.0)
{ {
m_scale = m_starting.scale * ratio; m_scale = m_starting.scale * ratio;
if (m_starting.ctrl_down && abs(ratio-1.0f)>0.001) {
m_scale.z() = m_starting.scale.z();
double local_offset_x = 0.5 * (m_scale.x() - m_starting.scale.x()) * m_starting.box.size().x();
double local_offset_y = 0.5 * (m_scale.y() - m_starting.scale.y()) * m_starting.box.size().y();
Vec3d local_offset_vec = Vec3d::Zero();
switch (m_hover_id)
{
case 6: { local_offset_vec = Vec3d(-local_offset_x, -local_offset_y, 0.0); break; }
case 7: { local_offset_vec = Vec3d( local_offset_x, -local_offset_y, 0.0); break; }
case 8: { local_offset_vec = Vec3d( local_offset_x, local_offset_y, 0.0); break; }
case 9: { local_offset_vec = Vec3d(-local_offset_x, local_offset_y, 0.0); break; }
default: break;
}
if (m_object_manipulation->is_world_coordinates()) {
m_offset = local_offset_vec;
} else {
m_offset = m_grabbers_tran.get_matrix_no_offset() * local_offset_vec;
}
} else {
m_offset = Vec3d::Zero(); m_offset = Vec3d::Zero();
} }
} }
}
double GLGizmoScale3D::calc_ratio(const UpdateData& data) const double GLGizmoScale3D::calc_ratio(const UpdateData& data) const
{ {