Exemple #1
0
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));
}