Fixed gizmo move 3d axis Z

This commit is contained in:
Enrico Turri 2018-09-14 14:37:13 +02:00
parent b3c30a08b0
commit d139274da8
2 changed files with 17 additions and 13 deletions

View file

@ -1032,6 +1032,7 @@ GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent)
, m_position(Vec3d::Zero()) , m_position(Vec3d::Zero())
, m_starting_drag_position(Vec3d::Zero()) , m_starting_drag_position(Vec3d::Zero())
, m_starting_box_center(Vec3d::Zero()) , m_starting_box_center(Vec3d::Zero())
, m_starting_box_bottom_center(Vec3d::Zero())
{ {
} }
@ -1065,17 +1066,19 @@ void GLGizmoMove3D::on_start_dragging(const BoundingBoxf3& box)
{ {
m_starting_drag_position = m_grabbers[m_hover_id].center; m_starting_drag_position = m_grabbers[m_hover_id].center;
m_starting_box_center = box.center(); m_starting_box_center = box.center();
m_starting_box_bottom_center = box.center();
m_starting_box_bottom_center(2) = box.min(2);
} }
} }
void GLGizmoMove3D::on_update(const Linef3& mouse_ray) void GLGizmoMove3D::on_update(const Linef3& mouse_ray)
{ {
if (m_hover_id == 0) if (m_hover_id == 0)
m_position(0) = 2.0 * m_starting_box_center(0) + calc_displacement(1, mouse_ray) - m_starting_drag_position(0); m_position(0) = 2.0 * m_starting_box_center(0) + calc_projection(X, 1, mouse_ray) - m_starting_drag_position(0);
else if (m_hover_id == 1) else if (m_hover_id == 1)
m_position(1) = 2.0 * m_starting_box_center(1) + calc_displacement(2, mouse_ray) - m_starting_drag_position(1); m_position(1) = 2.0 * m_starting_box_center(1) + calc_projection(Y, 2, mouse_ray) - m_starting_drag_position(1);
else if (m_hover_id == 2) else if (m_hover_id == 2)
m_position(2) = 2.0 * m_starting_box_center(2) + calc_displacement(1, mouse_ray) - m_starting_drag_position(2); m_position(2) = 2.0 * m_starting_box_bottom_center(2) + calc_projection(Z, 1, mouse_ray) - m_starting_drag_position(2);
} }
void GLGizmoMove3D::on_render(const BoundingBoxf3& box) const void GLGizmoMove3D::on_render(const BoundingBoxf3& box) const
@ -1144,40 +1147,40 @@ void GLGizmoMove3D::on_render_for_picking(const BoundingBoxf3& box) const
render_grabbers_for_picking(box); render_grabbers_for_picking(box);
} }
double GLGizmoMove3D::calc_displacement(unsigned int preferred_plane_id, const Linef3& mouse_ray) const double GLGizmoMove3D::calc_projection(Axis axis, unsigned int preferred_plane_id, const Linef3& mouse_ray) const
{ {
double displacement = 0.0; double projection = 0.0;
Vec3d starting_vec = m_starting_drag_position - m_starting_box_center; Vec3d starting_vec = (axis == Z) ? m_starting_drag_position - m_starting_box_bottom_center : m_starting_drag_position - m_starting_box_center;
double len_starting_vec = starting_vec.norm(); double len_starting_vec = starting_vec.norm();
if (len_starting_vec == 0.0) if (len_starting_vec == 0.0)
return displacement; return projection;
Vec3d starting_vec_dir = starting_vec.normalized(); Vec3d starting_vec_dir = starting_vec.normalized();
Vec3d mouse_dir = mouse_ray.unit_vector(); Vec3d mouse_dir = mouse_ray.unit_vector();
unsigned int plane_id = select_best_plane(mouse_dir, preferred_plane_id); unsigned int plane_id = select_best_plane(mouse_dir, preferred_plane_id);
switch (plane_id) switch (plane_id)
{ {
case 0: case 0:
{ {
displacement = starting_vec_dir.dot(intersection_on_plane_xy(mouse_ray, m_starting_box_center)); projection = starting_vec_dir.dot(intersection_on_plane_xy(mouse_ray, (axis == Z) ? m_starting_box_bottom_center : m_starting_box_center));
break; break;
} }
case 1: case 1:
{ {
displacement = starting_vec_dir.dot(intersection_on_plane_xz(mouse_ray, m_starting_box_center)); projection = starting_vec_dir.dot(intersection_on_plane_xz(mouse_ray, (axis == Z) ? m_starting_box_bottom_center : m_starting_box_center));
break; break;
} }
case 2: case 2:
{ {
displacement = starting_vec_dir.dot(intersection_on_plane_yz(mouse_ray, m_starting_box_center)); projection = starting_vec_dir.dot(intersection_on_plane_yz(mouse_ray, (axis == Z) ? m_starting_box_bottom_center : m_starting_box_center));
break; break;
} }
} }
return displacement; return projection;
} }
GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent) GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent)

View file

@ -287,6 +287,7 @@ class GLGizmoMove3D : public GLGizmoBase
Vec3d m_position; Vec3d m_position;
Vec3d m_starting_drag_position; Vec3d m_starting_drag_position;
Vec3d m_starting_box_center; Vec3d m_starting_box_center;
Vec3d m_starting_box_bottom_center;
public: public:
explicit GLGizmoMove3D(GLCanvas3D& parent); explicit GLGizmoMove3D(GLCanvas3D& parent);
@ -302,7 +303,7 @@ protected:
virtual void on_render_for_picking(const BoundingBoxf3& box) const; virtual void on_render_for_picking(const BoundingBoxf3& box) const;
private: private:
double calc_displacement(unsigned int preferred_plane_id, const Linef3& mouse_ray) const; double calc_projection(Axis axis, unsigned int preferred_plane_id, const Linef3& mouse_ray) const;
}; };
class GLGizmoFlatten : public GLGizmoBase class GLGizmoFlatten : public GLGizmoBase