Files
EgtGeomKernel/CDeBoxClosedSurfTm.cpp
T
DarioS 3f2b6b2115 EgtGeomKernel :
- aggiunte prime funzione per verifica collisione con oggetto capsule
- piccoli aggiornamenti alle verifiche di collisione.
2022-05-16 07:51:57 +02:00

56 lines
2.0 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2016-2020
//----------------------------------------------------------------------------
// File : CDBoxSurfTm.cpp Data : 09.01.20 Versione : 2.2a2
// 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.
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CDeBoxTria.h"
#include "/EgtDev/Include/EGkCDeBoxClosedSurfTm.h"
#include "/EgtDev/Include/EGkDistPointSurfTm.h"
using namespace std ;
//----------------------------------------------------------------------------
bool
CDeBoxClosedSurfTm( const Frame3d& frBox, const Vector3d& vtDiag, double dSafeDist, const ISurfTriMesh& Stm)
{
// recupero BBox del poliedro
BBox3d b3Poly = Stm.GetAllTriaBox() ;
// calcolo il BBox del parallelepipedo
BBox3d b3Box( ORIG, ORIG + vtDiag) ;
if ( dSafeDist > EPS_SMALL)
b3Box.Expand( dSafeDist) ;
b3Box.ToGlob( frBox) ;
// Se i BBox non interferiscono, non c'è collisione
if ( ! b3Box.Overlaps( b3Poly))
return false ;
// recupero i triangoli che interferiscono con il box
INTVECTOR vT ;
Stm.GetAllTriaOverlapBox( b3Box, vT) ;
for ( int nT : vT) {
Triangle3d Tria ;
if ( Stm.GetTriangle( nT, Tria)) {
if ( CDeBoxTria( frBox, vtDiag, dSafeDist, Tria))
return true ;
}
}
// Se superficie aperta, non c'è collisione
if ( ! Stm.IsClosed())
return false ;
// Verifico se il box è dentro la superficie tramite calcolo distanza minima.
Point3d ptBoxCen = ORIG + vtDiag / 2 ;
ptBoxCen.ToGlob( frBox) ;
DistPointSurfTm DistBoxCenSurfCalc( ptBoxCen, Stm) ;
// Se il box è interno c'è collisione
return DistBoxCenSurfCalc.IsPointInside() ;
}