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(); }
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; }