9653ba8d53
- aggiunte funzioni di Test tra solido e superficie speculari di quelle di Collision Detection degli stessi solidi con colido.
106 lines
4.4 KiB
C++
106 lines
4.4 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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 ;
|
|
}
|