//angle is in radian void computeAngleAndAxis(Vector3 * rotation, float * angle) { if (cur_mx != last_mx || cur_my != last_my) { Vector3 va = get_arcball_vector(last_mx, last_my); Vector3 vb = get_arcball_vector( cur_mx, cur_my); *angle = acos(va.dotProduct(vb))*180.0/PI; *rotation = va.crossProduct(vb); } }
void Viewer::update_arcball() { if (m_arcball_active && m_mouse != m_last_mouse) { glm::mat4 camera_matrix;// = m_object2world; //glGetFloatv(GL_MODELVIEW_MATRIX, glm::value_ptr(camera_matrix)); glm::vec3 va = get_arcball_vector(m_last_mouse); glm::vec3 vb = get_arcball_vector(m_mouse); float angle = acos(std::min(1.0f, glm::dot(va, vb))); glm::vec3 axis_in_camera_coord = glm::cross(va, vb); glm::mat3 camera2object = glm::inverse(glm::mat3(camera_matrix) * glm::mat3(m_last_object2world)); glm::vec3 axis_in_object_coord = camera2object * axis_in_camera_coord; m_object2world = glm::rotate(m_last_object2world, angle, axis_in_object_coord); //g_last_mouse = m_mouse; } }