void Navigation::rotate( float hAngle , float vAngle) { static const QVector3D up(0.0, 1.0, 0.0); m_rotationHappened = true; const QVector3D ray((m_camera.center() - m_eye).normalized()); const QVector3D rotAxis(QVector3D::crossProduct(ray, up)); hAngle *= ROTATION_HOR_DOF; vAngle *= ROTATION_VER_DOF; enforceRotationConstraints(hAngle, vAngle); QVector3D t = m_i0Valid ? m_i0 : m_center; QMatrix4x4 transform; transform.translate( t); transform.rotate(hAngle, up); transform.rotate(vAngle, rotAxis); transform.translate(-t); m_camera.setEye(transform * m_eye); m_camera.setCenter(transform * m_center); m_camera.update(); }
void WorldInHandNavigation::rotate( float hAngle , float vAngle) { m_rotationHappened = true; const glm::vec3 ray(glm::normalize(m_cameraCapability.center() - m_eye)); const glm::vec3 rotAxis(glm::cross(ray, m_cameraCapability.up())); hAngle *= ROTATION_HOR_DOF; vAngle *= ROTATION_VER_DOF; enforceRotationConstraints(hAngle, vAngle); glm::vec3 t = m_refPositionValid ? m_referencePosition : m_center;; glm::mat4x4 transform = glm::mat4x4(); transform = glm::translate(transform, t); transform = glm::rotate(transform, hAngle, m_cameraCapability.up()); transform = glm::rotate(transform, vAngle, rotAxis); transform = glm::translate(transform, -t); glm::vec4 newEye = transform * glm::vec4(m_eye, 0.0f); glm::vec4 newCenter = transform * glm::vec4(m_center, 0.0f); m_cameraCapability.setEye(glm::vec3(newEye)); m_cameraCapability.setCenter(glm::vec3(newCenter)); }