Esempio n. 1
0
//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);

    }

}
Esempio n. 2
0
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;
  }
}