ddade325c4
- standardizzate le funzione Collision Detection sia per trimesh sia per Zmap (ex Avoid...) - nelle funzioni Cde ora se arrivano geometrie errate si ritorna collisione (maggior sicurezza).
63 lines
2.4 KiB
C++
63 lines
2.4 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2020-2020
|
|
//----------------------------------------------------------------------------
|
|
// File : CDCylSurfTm.cpp Data : 09.01.20 Versione : 2.2a2
|
|
// Contenuto : Implementazione della verifica di collisione tra
|
|
// Sphere e Closed SurftriMesh.
|
|
//
|
|
//
|
|
// Modifiche : 09.01.20 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "CDeSpheTria.h"
|
|
#include "/EgtDev/Include/EGkCDeSpheClosedSurfTm.h"
|
|
#include "/EgtDev/Include/EGkDistPointSurfTm.h"
|
|
|
|
using namespace std ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// La funzione restituisce :
|
|
// - true in caso di collisione o inconsistenza dei parametri di input
|
|
// - false in caso di assenza di collisione.
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
CDeSpheClosedSurfTm( const Point3d& ptCen, double dR, const ISurfTriMesh& Stm, double dSafeDist)
|
|
{
|
|
// Il raggio deve essere non nullo
|
|
if ( dR < EPS_SMALL)
|
|
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 della sfera
|
|
BBox3d b3Sphe( ptCen, dR) ;
|
|
if ( dSafeDist > EPS_SMALL)
|
|
b3Sphe.Expand( dSafeDist) ;
|
|
// Se i BBox non interferiscono, non c'è collisione
|
|
if ( ! b3Sphe.Overlaps( b3Poly))
|
|
return false ;
|
|
// Verifico se la sfera interferisce con i triangoli del poliedro presenti nel suo BBox
|
|
INTVECTOR vT ;
|
|
Stm.GetAllTriaOverlapBox( b3Sphe, vT) ;
|
|
for ( int nT : vT) {
|
|
Triangle3d Tria ;
|
|
if ( Stm.GetTriangle( nT, Tria)) {
|
|
if ( CDeSpheTria( ptCen, dR, Tria, dSafeDist))
|
|
return true ;
|
|
}
|
|
}
|
|
// Se il BBox della sfera non è interno a quello del poliedro e viceversa, non c'è collisione
|
|
if ( ! b3Sphe.Encloses( b3Poly) && ! b3Poly.Encloses( b3Sphe))
|
|
return false ;
|
|
// Verifico se la sfera è dentro la superficie tramite calcolo distanza minima del suo centro
|
|
DistPointSurfTm DistCenSurfCalc( ptCen, Stm) ;
|
|
// C'è collisione se la sfera è interna.
|
|
return ( DistCenSurfCalc.IsPointInside()) ;
|
|
}
|