EgtGraphics 2.6b4 :

- aggiunta possibilità di un offset angolare in viste standard.
This commit is contained in:
Dario Sassi
2024-02-19 14:50:00 +01:00
parent 1c37299baf
commit e8b10ef4e8
4 changed files with 41 additions and 24 deletions
+31 -21
View File
@@ -83,16 +83,16 @@ Scene::SetCamera( int nDir, double dDist)
m_vtDirCamera.Set( 0, 0, -1) ;
break ;
case CT_ISO_SW :
m_vtDirCamera.Set( - SQRT1_3, - SQRT1_3, SQRT1_3) ;
m_vtDirCamera.Set( -SQRT1_3, -SQRT1_3, SQRT1_3) ;
break ;
case CT_ISO_SE :
m_vtDirCamera.Set( SQRT1_3, - SQRT1_3, SQRT1_3) ;
m_vtDirCamera.Set( SQRT1_3, -SQRT1_3, SQRT1_3) ;
break ;
case CT_ISO_NE :
m_vtDirCamera.Set( SQRT1_3, SQRT1_3, SQRT1_3) ;
break ;
case CT_ISO_NW :
m_vtDirCamera.Set( - SQRT1_3, SQRT1_3, SQRT1_3) ;
m_vtDirCamera.Set( -SQRT1_3, SQRT1_3, SQRT1_3) ;
break ;
case CT_CPLANE :
m_vtDirCamera = GetGridFrame().VersZ() ;
@@ -101,14 +101,15 @@ Scene::SetCamera( int nDir, double dDist)
return false ;
break ;
}
if ( nDir != CT_CPLANE)
m_vtDirCamera.Rotate( Z_AX, m_nOrizzOffsCamera * ANG_RIGHT) ;
m_dDistCamera = dDist ;
return VerifyCamera() ;
return VerifyCamera( nDir != CT_CPLANE) ;
}
//----------------------------------------------------------------------------
bool
Scene::VerifyCamera( void)
Scene::VerifyCamera( bool bUseOrizzOffsCamera)
{
// verifico il versore
if ( ! m_vtDirCamera.Normalize())
@@ -118,12 +119,16 @@ Scene::VerifyCamera( void)
m_dDistCamera = STD_DIST_CAMERA ;
else
m_dDistCamera = max( m_dDistCamera, MIN_DIST_CAMERA) ;
// invalido Up e ExtView
// ricalcolo direzione Up
m_bUpOk = false ;
if ( ! CalcDirUp( bUseOrizzOffsCamera))
return false ;
// ricalcolo ExtView
m_bExtViewOk = false ;
if ( ! CalcExtView())
return false ;
// calcolo nuovi dati di Z clipping
CalcClippingPlanesFromExtView() ;
return true ;
return CalcClippingPlanesFromExtView() ;
}
//----------------------------------------------------------------------------
@@ -157,25 +162,27 @@ Scene::GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist) c
int
Scene::GetCameraDir( void) const
{
if ( m_vtDirCamera.IsZplus())
Vector3d vtDir = m_vtDirCamera ;
vtDir.Rotate( Z_AX, - m_nOrizzOffsCamera * ANG_RIGHT) ;
if ( vtDir.IsZplus())
return CT_TOP ;
else if ( m_vtDirCamera.IsYminus())
else if ( vtDir.IsYminus())
return CT_FRONT ;
else if ( m_vtDirCamera.IsXplus())
else if ( vtDir.IsXplus())
return CT_RIGHT ;
else if ( m_vtDirCamera.IsYplus())
else if ( vtDir.IsYplus())
return CT_BACK ;
else if ( m_vtDirCamera.IsXminus())
else if ( vtDir.IsXminus())
return CT_LEFT ;
else if ( m_vtDirCamera.IsZminus())
else if ( vtDir.IsZminus())
return CT_BOTTOM ;
else if ( AreSameVectorApprox( m_vtDirCamera, Vector3d( - SQRT1_3, - SQRT1_3, SQRT1_3)))
else if ( AreSameVectorApprox( vtDir, Vector3d( - SQRT1_3, - SQRT1_3, SQRT1_3)))
return CT_ISO_SW ;
else if ( AreSameVectorApprox( m_vtDirCamera, Vector3d( SQRT1_3, - SQRT1_3, SQRT1_3)))
else if ( AreSameVectorApprox( vtDir, Vector3d( SQRT1_3, - SQRT1_3, SQRT1_3)))
return CT_ISO_SE ;
else if ( AreSameVectorApprox( m_vtDirCamera, Vector3d( SQRT1_3, SQRT1_3, SQRT1_3)))
else if ( AreSameVectorApprox( vtDir, Vector3d( SQRT1_3, SQRT1_3, SQRT1_3)))
return CT_ISO_NE ;
else if ( AreSameVectorApprox( m_vtDirCamera, Vector3d( - SQRT1_3, SQRT1_3, SQRT1_3)))
else if ( AreSameVectorApprox( vtDir, Vector3d( - SQRT1_3, SQRT1_3, SQRT1_3)))
return CT_ISO_NW ;
else
return CT_NONE ;
@@ -194,7 +201,7 @@ Scene::GetProjectedCenter( void) const
//----------------------------------------------------------------------------
bool
Scene::CalcDirUp( void)
Scene::CalcDirUp( bool bUseOrizzOffsCamera)
{
// verifico se il calcolo è necessario
if ( m_bUpOk)
@@ -202,8 +209,11 @@ Scene::CalcDirUp( void)
// direzione perpendicolare giacente nel piano XY
// ( m_vtDirCamera è opposta alla direzione in cui si guarda)
Vector3d vtPerpXY = m_vtDirCamera ^ Z_AX ;
if ( ! vtPerpXY.Normalize())
if ( ! vtPerpXY.Normalize()) {
vtPerpXY = -X_AX ;
if ( bUseOrizzOffsCamera)
vtPerpXY.Rotate( Z_AX, m_nOrizzOffsCamera * ANG_RIGHT) ;
}
// direzione Up
m_vtUp = vtPerpXY ^ m_vtDirCamera ;
m_bUpOk = m_vtUp.Normalize() ;