//---------------------------------------------------------------------------- // EgalTech 2020-2020 //---------------------------------------------------------------------------- // File : CDCylSurfTm.cpp Data : 09.11.20 Versione : // Contenuto : Implementazione della verifica di collisione tra // Cone e Closed SurftriMesh. // // // Modifiche : 09.11.20 LM Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "CDeConeFrustumTria.h" #include "/EgtDev/Include/EGkCDeConeFrustumClosedSurfTm.h" #include "/EgtDev/Include/EGkDistPointSurfTm.h" using namespace std ; //---------------------------------------------------------------------------- // Il sistema di riferimento deve avere l'asse di simmetria del cono come asse Z e origine nel centro della base. // La distanza di sicurezza ha effetto solo se maggiore di epsilon, altrimenti è ignorata ed è ininfluente. // Il sistema di riferimento del cono deve essere immerso in quello della superficie. bool CDeConeFrustumClosedSurfTm( const Frame3d& frCone, double dBaseRad, double dTopRad, double dHeight, double dSafeDist, const ISurfTriMesh& Stm) { // Se il tronco di cono non è ben definito non ha senso proseguire. if ( max( dBaseRad, dTopRad) < EPS_SMALL || dHeight < EPS_SMALL) return false ; // Recupero BBox della trimesh BBox3d b3Surf = Stm.GetAllTriaBox() ; // Calcolo il BBox del tronco di cono double dMaxRad = max( dBaseRad, dTopRad) ; BBox3d b3Cone( - dMaxRad, - dMaxRad, 0, dMaxRad, dMaxRad, dHeight) ; if ( dSafeDist > EPS_SMALL) b3Cone.Expand( dSafeDist) ; b3Cone.ToGlob( frCone) ; // Se i BBox non interferiscono, non c'è collisione if ( ! b3Cone.Overlaps( b3Surf)) return false ; // Recupero i triangoli che interferiscono con il box del cono INTVECTOR vT ; Stm.GetAllTriaOverlapBox( b3Cone, vT) ; // Ciclo sui triangoli che interferiscono col box del cono for ( int nT : vT) { Triangle3d trTria ; if ( Stm.GetTriangle( nT, trTria)) { if ( CDeConeFrustumTria( frCone, dBaseRad, dTopRad, dHeight, dSafeDist, trTria)) return true ; } } // Se superficie aperta, non c'è collisione if ( ! Stm.IsClosed()) return false ; // Verifico se il tronco di cono è dentro la superficie tramite calcolo distanza minima. Point3d ptConeCen( 0, 0, dHeight / 2) ; ptConeCen.ToGlob( frCone) ; DistPointSurfTm DistConeCenSurfCalc( ptConeCen, Stm) ; // Se il tronco di cono è interno c'è collisione return DistConeCenSurfCalc.IsPointInside() ; }