Fixed unselected instance synchronization when rotating using rotate gizmo

This commit is contained in:
Enrico Turri 2019-01-23 11:08:18 +01:00
parent f2ec6eb249
commit cc9cf7f39e
2 changed files with 8 additions and 13 deletions

View file

@ -1189,17 +1189,12 @@ Vec3d extract_euler_angles(const Eigen::Matrix<double, 3, 3, Eigen::DontAlign>&
Vec3d angles2 = Vec3d::Zero(); Vec3d angles2 = Vec3d::Zero();
if (is_approx(std::abs(rotation_matrix(2, 0)), 1.0)) if (is_approx(std::abs(rotation_matrix(2, 0)), 1.0))
{ {
angles1(2) = 0.0; // the handling of singular cases deviates from the cited paper
if (rotation_matrix(2, 0) > 0.0) // == +1.0 // the following code works better when rotating an object with the gizmo after having
{ // changed its orientation using the place on bed gizmo
angles1(1) = -0.5 * (double)PI; angles1(0) = 0.0;
angles1(0) = -angles1(2) + ::atan2(-rotation_matrix(0, 1), -rotation_matrix(0, 2));
}
else // == -1.0
{
angles1(1) = 0.5 * (double)PI; angles1(1) = 0.5 * (double)PI;
angles1(0) = angles1(2) + ::atan2(rotation_matrix(0, 1), rotation_matrix(0, 2)); angles1(2) = angles1(0) + ::atan2(rotation_matrix(0, 1), rotation_matrix(0, 2));
}
angles2 = angles1; angles2 = angles1;
} }
else else

View file

@ -2408,7 +2408,7 @@ void GLCanvas3D::Selection::_update_type()
void GLCanvas3D::Selection::_set_caches() void GLCanvas3D::Selection::_set_caches()
{ {
m_cache.volumes_data.clear(); m_cache.volumes_data.clear();
for (unsigned int i : m_list) for (unsigned int i = 0; i < (unsigned int)m_volumes->size(); ++i)
{ {
const GLVolume* v = (*m_volumes)[i]; const GLVolume* v = (*m_volumes)[i];
m_cache.volumes_data.emplace(i, VolumeCache(v->get_volume_transformation(), v->get_instance_transformation())); m_cache.volumes_data.emplace(i, VolumeCache(v->get_volume_transformation(), v->get_instance_transformation()));
@ -2699,7 +2699,7 @@ void GLCanvas3D::Selection::_synchronize_unselected_instances(bool including_z)
if ((v->object_idx() != object_idx) || (v->instance_idx() == instance_idx)) if ((v->object_idx() != object_idx) || (v->instance_idx() == instance_idx))
continue; continue;
v->set_instance_rotation(Vec3d(rotation(0), rotation(1), including_z ? rotation(2) : v->get_instance_rotation()(2))); v->set_instance_rotation(Vec3d(rotation(0), rotation(1), including_z ? rotation(2) : m_cache.volumes_data[j].get_instance_rotation()(2) + rotation(2)));
v->set_instance_scaling_factor(scaling_factor); v->set_instance_scaling_factor(scaling_factor);
v->set_instance_mirror(mirror); v->set_instance_mirror(mirror);