void Camera::setFocusDirection( Vector3d focusVector, float seconds )
{

    focusVector.normalize();

    // Check for indeterminate focus
    if( focusVector!=focusVector )
        return;

    // Set orientation by rotating view directly toward destination
    float vAngle = acos(vEye.dotProduct(focusVector));
    if( vAngle<.001 ) {
        vEye = focusVector;
        setVRight();
        setVUp();
        setMatrix();
        return;
    }

    if( vAngle>3.141 && vAngle<3.142 )
        rotV = vUp;
    else {
        rotV = vEye * focusVector;
        rotV.normalize();
    }

    finalV = focusVector;
    cType = ROTATE;
    storeCamera(tCam);
    cAccel.set(seconds*1000., vAngle);

    step();

}
Пример #2
0
void Viewer::run() {
    m_GUI.loadSettings(*m_Settings.m_pCacheRoot);

    setUp();

    m_nFrameID = 0;
    while (m_WindowManager.isOpen()) {
        auto startTime = m_WindowManager.getSeconds();

        m_WindowManager.handleEvents();

        m_GUI.startFrame();

        m_Camera.exposeIO(m_GUI);
        exposeConfigIO();
        exposeLightsIO();

        m_ViewController.setViewMatrix(m_Camera.getViewMatrix());

        drawFrame();

        auto size = m_WindowManager.getSize();
        glViewport(0, 0, (int)size.x, (int)size.y);
        m_bGUIHasFocus = m_GUI.draw();

        m_WindowManager.swapBuffers();

        if (!m_bGUIHasFocus) {
            float ellapsedTime = float(m_WindowManager.getSeconds() - startTime);
            if(m_ViewController.update(ellapsedTime)) {
                m_Camera = ProjectiveCamera(m_ViewController.getViewMatrix(), m_Camera.getFovY(),
                                            m_Settings.m_FramebufferSize.x, m_Settings.m_FramebufferSize.y,
                                            getZNear(), getZFar());
                m_CameraUpdateFlag.addUpdate();
            }
        }

        ++m_nFrameID;
    }

    tearDown();

    m_RenderModule.tearDown(m_Settings.m_pCacheRoot);
    storeCamera();

    if(m_nCurrentConfig < m_ConfigManager.getConfigs().size()) {
        // Store current config
        auto pConfig = m_Settings.m_pCacheRoot->FirstChildElement("Config");
        if(!pConfig) {
            pConfig = m_Settings.m_CacheDocument.NewElement("Config");
            m_Settings.m_pCacheRoot->InsertEndChild(pConfig);
        }
        setAttribute(*pConfig, "name", m_ConfigManager.getConfigName(m_nCurrentConfig));
    }

    m_GUI.storeSettings(*m_Settings.m_pCacheRoot);

    m_Settings.m_CacheDocument.SaveFile(m_Settings.m_CacheFilePath.c_str());
}
Camera::Camera( int xSize, int ySize, float fps )
{
    setSize(xSize, ySize);
    setFps(fps);
    setPosition(Vector3d(0., 0., 0.));
    setFocusPosition(0.);
    storeCamera(camStore);
}
Vector3d Camera::getFocusPoint( float distance, float longitude, float latitude )
{

    // Get point coordinates
    storeCamera(tCam);
    setFocusPosition(-distance, longitude, latitude, 0.);
    Vector3d focus = position - tCam.position;
    if( focus==Vector3d(0., 0., 0.) ) {
        restoreCamera(tCam);
        return tCam.eye;
    }
    focus.normalize();
    restoreCamera(tCam);
    return focus;

}
void Camera::moveToPoint( const Vector3d &newPosition, float finalDist, float seconds )
{

    if( position==newPosition )
        return;
    moveV = newPosition-position;
    float distance = sqrt(moveV.dotProduct(moveV)) - finalDist;
    moveV.normalize();
    finalPos = newPosition-moveV*finalDist;

    cType = MOVE;
    storeCamera(tCam);
    cAccel.set(seconds*1000., distance);

    step();

}
bool Camera::pollEvent( SDL_Event *event )
    // This should be called at regular intervals to avoid key-response lag
{

    if( !SDL_PollEvent(event) ) {

        if( event->type==SDL_QUIT )
            exit(0);
        if( event->type!=SDL_KEYDOWN )
        {
            step();
            return false;
        }

    }

    switch( event->key.keysym.sym ) {

    case SDLK_LEFT:
        if( event->key.keysym.mod & KMOD_SHIFT )
            revolveLeft();
        else if( event->key.keysym.mod & KMOD_CTRL )
            rotateCW();
        else if( event->key.keysym.mod & KMOD_ALT )
            accelerateLeft(accInc);
        else
            panLeft();
        break;
    case SDLK_RIGHT:
        if( event->key.keysym.mod & KMOD_SHIFT )
            revolveRight();
        else if( event->key.keysym.mod & KMOD_CTRL )
            rotateCCW();
        else if( event->key.keysym.mod & KMOD_ALT )
            accelerateRight(accInc);
        else
            panRight();
        break;
    case SDLK_UP:
        if( event->key.keysym.mod & KMOD_SHIFT )
            revolveUp();
        else if( event->key.keysym.mod & KMOD_ALT )
            accelerateUp(accInc);
        else
            panUp();
        break;
    case SDLK_DOWN:
        if( event->key.keysym.mod & KMOD_SHIFT )
            revolveDown();
        else if( event->key.keysym.mod & KMOD_ALT )
            accelerateDown(accInc);
        else
            panDown();
        break;
	case SDLK_f:
	case SDLK_PERIOD:
        accelerate(accInc);
        break;
	case SDLK_b:
    case SDLK_COMMA:
        accelerate(-accInc);
        break;
    case SDLK_SPACE:
        stop();
        break;
    case SDLK_F1:
        accInc = accel[0];
        break;
    case SDLK_F2:
        accInc = accel[1];
        break;
    case SDLK_F3:
        accInc = accel[2];
        break;
    case SDLK_F4:
        accInc = accel[3];
        break;
    case SDLK_F5:
        accInc = accel[4];
        break;
    case SDLK_F6:
        accInc = accel[5];
        break;
    case SDLK_F7:
        accInc = accel[6];
        break;
    case SDLK_F8:
        accInc = accel[7];
        break;
    case SDLK_F9:
        accInc = accel[8];
        break;
    case SDLK_ESCAPE:
        exit(0);
        break;
    case SDLK_TAB:
        if( event->key.keysym.mod & KMOD_SHIFT )
            storeCamera(camStore);
        else
            restoreCamera(camStore);
            stop();
        break;

    default:
        break;

    }

    step();
    return true;

}