diff --git a/EgtGraphics.rc b/EgtGraphics.rc index b14c9a3..3e20ea2 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/SceneCamera.cpp b/SceneCamera.cpp index ad2f5d7..db95998 100644 --- a/SceneCamera.cpp +++ b/SceneCamera.cpp @@ -44,7 +44,14 @@ Scene::SetCamera( double dAngVertDeg, double dAngOrizzDeg, double dDist) // assegno la direzione e la distanza m_vtDirCamera = FromSpherical( 1, dAngVertDeg, dAngOrizzDeg) ; m_dDistCamera = dDist ; - return VerifyCamera() ; + if ( ! VerifyCamera()) + return false ; + // se vista da sopra, impongo vtUp da angolo orizzontale + if ( abs( dAngVertDeg) < EPS_ANG_SMALL) { + m_vtUp = - FromPolar( 1, dAngOrizzDeg) ; + m_bUpOk = true ; + } + return true ; } //---------------------------------------------------------------------------- @@ -121,8 +128,12 @@ Scene::GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist) double dAngVertDeg ; double dAngOrizzDeg ; m_vtDirCamera.ToSpherical( nullptr, &dAngVertDeg, &dAngOrizzDeg) ; - if ( fabs( dAngVertDeg) < EPS_ANG_SMALL) - dAngOrizzDeg = -90 ; + if ( fabs( dAngVertDeg) < EPS_ANG_SMALL) { + if ( m_bUpOk) + (-m_vtUp).ToSpherical( nullptr, nullptr, &dAngOrizzDeg) ; + else + dAngOrizzDeg = -90 ; + } if ( pdAngVertDeg != nullptr) *pdAngVertDeg = dAngVertDeg ; if ( pdAngOrizzDeg != nullptr) @@ -235,9 +246,6 @@ Scene::PanCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) bool Scene::RotateCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) { - const double MIN_ANG_VERT = 0.1 ; - const double MAX_ANG_VERT = 179.9 ; - // angoli correnti della camera double dAngVertDeg ; double dAngOrizzDeg ; @@ -248,6 +256,8 @@ Scene::RotateCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) double dDeltaAngOrizzDeg = ( ptWinNew.x - ptWinOld.x) / m_nViewportW * 360 ; // calcolo nuovi angoli e limitazione dell'angolo verticale + const double MIN_ANG_VERT = 0.0 ; + const double MAX_ANG_VERT = 180.0 ; dAngVertDeg -= dDeltaAngVertDeg ; if ( dAngVertDeg < MIN_ANG_VERT) dAngVertDeg = MIN_ANG_VERT ;