//---------------------------------------------------------------------------- // EgalTech 2016-2024 //---------------------------------------------------------------------------- // File : CDeBoxClosedSurfTm.cpp Data : 24.03.24 Versione : 2.6c2 // Contenuto : Implementazione della verifica di collisione tra // BoundingBox e Closed SurftriMesh. // // // Modifiche : 05.10.16 DS Creazione modulo. // 09.01.20 DS Cambio nome alla funzione. // 24.03.24 DS Aggiunta TestCylSurfTm. // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "CDeBoxTria.h" #include "/EgtDev/Include/EGkCDeBoxClosedSurfTm.h" #include "/EgtDev/Include/EGkDistPointSurfTm.h" using namespace std ; //---------------------------------------------------------------------------- // Il sistema di riferimento è allineato con il box e ha origine in un suo vertice. // La distanza di sicurezza ha effetto solo se maggiore di EPS_SMALL. // Il sistema di riferimento del box è riferito a quello della superficie. // La funzione restituisce : // - true in caso di collisione o inconsistenza dei parametri di input // - false in caso di assenza di collisione. //---------------------------------------------------------------------------- bool CDeBoxClosedSurfTm( const Frame3d& frBox, const Vector3d& vtDiag, const ISurfTriMesh& Stm, double dSafeDist) { // Se il box non è ben definito non ha senso proseguire if ( vtDiag.IsSmall()) return true ; // Se superficie non valida o aperta, non ha senso proseguire if ( ! Stm.IsValid() || ! Stm.IsClosed()) return true ; // Recupero BBox del poliedro BBox3d b3Poly = Stm.GetAllTriaBox() ; // Calcolo il BBox del parallelepipedo BBox3d b3BoxL( ORIG, ORIG + vtDiag) ; if ( dSafeDist > EPS_SMALL) b3BoxL.Expand( dSafeDist) ; BBox3d b3Box = GetToGlob( b3BoxL, frBox) ; // Se i BBox non interferiscono, non c'è collisione if ( ! b3Poly.Overlaps( b3Box) || ! b3Poly.Overlaps( frBox, b3BoxL)) return false ; // Verifico se il parallelepipedo interferisce con i triangoli del poliedro presenti nel suo BBox INTVECTOR vT ; Stm.GetAllTriaOverlapBox( b3Box, vT) ; for ( int nT : vT) { Triangle3d Tria ; if ( Stm.GetTriangle( nT, Tria)) { if ( CDeBoxTria( frBox, vtDiag, Tria, dSafeDist)) return true ; } } // Se il BBox del parallelepipedo non è interno a quello del poliedro e viceversa, non c'è collisione if ( ! b3Poly.Encloses( b3Box) && ! b3Box.Encloses( b3Poly)) return false ; // Verifico se il box è dentro la superficie tramite calcolo distanza minima del suo centro Point3d ptBoxCen = ORIG + vtDiag / 2 ; ptBoxCen.ToGlob( frBox) ; DistPointSurfTm DistBoxCenSurfCalc( ptBoxCen, Stm) ; // Se il box è interno c'è collisione return DistBoxCenSurfCalc.IsPointInside() ; } //---------------------------------------------------------------------------- // Verifica l'interferenza tra il box e la superficie : restituisce true in caso di interferenza. //---------------------------------------------------------------------------- bool TestBoxSurfTm( const Frame3d& frBox, const Vector3d& vtDiag, const ISurfTriMesh& Stm, double dSafeDist) { // Se il box non è ben definito non ha senso proseguire if ( vtDiag.IsSmall()) return true ; // Se superficie non valida, non ha senso proseguire if ( ! Stm.IsValid()) return true ; // Recupero BBox del poliedro BBox3d b3Poly = Stm.GetAllTriaBox() ; // Calcolo il BBox del parallelepipedo BBox3d b3BoxL( ORIG, ORIG + vtDiag) ; if ( dSafeDist > EPS_SMALL) b3BoxL.Expand( dSafeDist) ; BBox3d b3Box = GetToGlob( b3BoxL, frBox) ; // Se i BBox non interferiscono, non c'è collisione if ( ! b3Poly.Overlaps( b3Box) || ! b3Poly.Overlaps( frBox, b3BoxL)) return false ; // Verifico se il parallelepipedo interferisce con i triangoli del poliedro presenti nel suo BBox INTVECTOR vT ; Stm.GetAllTriaOverlapBox( b3Box, vT) ; for ( int nT : vT) { Triangle3d Tria ; if ( Stm.GetTriangle( nT, Tria)) { if ( CDeBoxTria( frBox, vtDiag, Tria, dSafeDist)) return true ; } } // Non c'è interferenza return false ; }