Fixed rotation of multiple instances selection
This commit is contained in:
parent
172daa8989
commit
b89e95aea7
1 changed files with 76 additions and 56 deletions
|
@ -1222,7 +1222,26 @@ void GLCanvas3D::Selection::rotate(const Vec3d& rotation, GLCanvas3D::Transforma
|
||||||
// Only relative rotation values are allowed in the world coordinate system.
|
// Only relative rotation values are allowed in the world coordinate system.
|
||||||
assert(! transformation_type.world() || transformation_type.relative());
|
assert(! transformation_type.world() || transformation_type.relative());
|
||||||
|
|
||||||
int rot_axis_max;
|
int rot_axis_max = 0;
|
||||||
|
if (rotation.isApprox(Vec3d::Zero()))
|
||||||
|
{
|
||||||
|
for (unsigned int i : m_list)
|
||||||
|
{
|
||||||
|
GLVolume &volume = *(*m_volumes)[i];
|
||||||
|
if (m_mode == Instance)
|
||||||
|
{
|
||||||
|
volume.set_instance_rotation(m_cache.volumes_data[i].get_instance_rotation());
|
||||||
|
volume.set_instance_offset(m_cache.volumes_data[i].get_instance_position());
|
||||||
|
}
|
||||||
|
else if (m_mode == Volume)
|
||||||
|
{
|
||||||
|
volume.set_volume_rotation(m_cache.volumes_data[i].get_volume_rotation());
|
||||||
|
volume.set_volume_offset(m_cache.volumes_data[i].get_volume_position());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
//FIXME this does not work for absolute rotations (transformation_type.absolute() is true)
|
//FIXME this does not work for absolute rotations (transformation_type.absolute() is true)
|
||||||
rotation.cwiseAbs().maxCoeff(&rot_axis_max);
|
rotation.cwiseAbs().maxCoeff(&rot_axis_max);
|
||||||
|
|
||||||
|
@ -1245,8 +1264,8 @@ void GLCanvas3D::Selection::rotate(const Vec3d& rotation, GLCanvas3D::Transforma
|
||||||
transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation();
|
transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation();
|
||||||
if (rot_axis_max == 2 && transformation_type.joint()) {
|
if (rot_axis_max == 2 && transformation_type.joint()) {
|
||||||
// Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis.
|
// Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis.
|
||||||
double z_diff = rotation_diff_z(new_rotation, m_cache.volumes_data[i].get_instance_rotation());
|
Vec3d offset = Geometry::assemble_transform(Vec3d::Zero(), Vec3d(0.0, 0.0, new_rotation(2) - m_cache.volumes_data[i].get_instance_rotation()(2))) * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center);
|
||||||
volume.set_instance_offset(m_cache.dragging_center + Eigen::AngleAxisd(z_diff, Vec3d::UnitZ()) * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center));
|
volume.set_instance_offset(m_cache.dragging_center + offset);
|
||||||
}
|
}
|
||||||
volume.set_instance_rotation(new_rotation);
|
volume.set_instance_rotation(new_rotation);
|
||||||
object_instance_first[volume.object_idx()] = i;
|
object_instance_first[volume.object_idx()] = i;
|
||||||
|
@ -1288,6 +1307,7 @@ void GLCanvas3D::Selection::rotate(const Vec3d& rotation, GLCanvas3D::Transforma
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if !DISABLE_INSTANCES_SYNCH
|
#if !DISABLE_INSTANCES_SYNCH
|
||||||
if (m_mode == Instance)
|
if (m_mode == Instance)
|
||||||
|
|
Loading…
Add table
Reference in a new issue