diff --git a/CDeBoxClosedSurfTm.cpp b/CDeBoxClosedSurfTm.cpp new file mode 100644 index 0000000..a550cc6 --- /dev/null +++ b/CDeBoxClosedSurfTm.cpp @@ -0,0 +1,49 @@ +//---------------------------------------------------------------------------- +// 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 "/EgtDev/Include/EGkCDeBoxTria.h" +#include "/EgtDev/Include/EGkCDeBoxClosedSurfTm.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +bool +CDeBoxClosedSurfTm( const Frame3d& frBox, const Vector3d& vtDiag, double dSafeDist, const ISurfTriMesh& Stm) +{ + // verifico che la trimesh sia effettivamente un poliedro + if ( ! Stm.IsClosed()) + return false ; + // recupero BBox del poliedro + BBox3d b3Poly = Stm.GetAllTriaBox() ; + // calcolo il BBox del parallelepipedo + BBox3d b3Box( ORIG, ORIG + vtDiag) ; + b3Box.Expand( dSafeDist) ; + b3Box.ToGlob( frBox) ; + // confronto i due Box + 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 ; + } + } + return false ; + +} diff --git a/CDeBoxPolyhedron.cpp b/CDeBoxPolyhedron.cpp deleted file mode 100644 index f6a4c5d..0000000 --- a/CDeBoxPolyhedron.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//---------------------------------------------------------------------------- -// EgalTech 2016-2016 -//---------------------------------------------------------------------------- -// File : CDBoxPolyhedron.cpp Data : 05.10.16 Versione : 1.6v1 -// Contenuto : Implementazione della verifica di collisione tra -// BoundingBox e Polyhedron. -// -// -// Modifiche : 05.10.16 DS Creazione modulo. -// -// -//---------------------------------------------------------------------------- - -//--------------------------- Include ---------------------------------------- -#include "stdafx.h" -#include "/EgtDev/Include/EGkCDeBoxTria.h" -#include "/EgtDev/Include/EGkCDeBoxPolyhedron.h" - -using namespace std ; - -//---------------------------------------------------------------------------- -bool -CDeBoxPolyhedron( const BBox3d& b3Box, const ISurfTriMesh& Stm) -{ - // verifico che la trimesh sia effettivamente un poliedro - if ( ! Stm.IsClosed()) - return false ; - // recupero BBox del poliedro - BBox3d b3Poly ; - if ( ! Stm.GetLocalBBox( b3Poly)) - return false ; - // confronto i due Box - if ( ! b3Box.Overlaps( b3Poly)) - return false ; - // confronto il Box con tutti i triangoli - Triangle3d Tria ; - int nId = Stm.GetFirstTriangle( Tria) ; - while ( nId != SVT_NULL) { - if ( CDeBoxTria( b3Box, Tria)) - return true ; - nId = Stm.GetNextTriangle( nId, Tria) ; - } - return false ; -} diff --git a/CDeBoxTria.cpp b/CDeBoxTria.cpp index f146e2a..8107edb 100644 --- a/CDeBoxTria.cpp +++ b/CDeBoxTria.cpp @@ -90,10 +90,18 @@ CDeBoxPlane( const BBox3d& Box, const Plane3d& Plane) //---------------------------------------------------------------------------- bool -CDeBoxTria( const BBox3d& b3Box, const Triangle3d& trTria) +CDeBoxTria( const Frame3d& frBox, const Vector3d& vtDiag, double dSafeDist, const Triangle3d& trTria) { // vedi Ericson, Real-Time Collision Detection, pag. 172 + Akenine-Moller + // Porto il triangolo nel riferimento del box + Triangle3d trTriaL = trTria ; + trTriaL.ToLoc( frBox) ; + + // Calcolo il box come tale + BBox3d b3Box( ORIG, ORIG + vtDiag) ; + b3Box.Expand( dSafeDist) ; + // Compute box center and extents Point3d ptCen ; Vector3d vtExt ; @@ -101,9 +109,9 @@ CDeBoxTria( const BBox3d& b3Box, const Triangle3d& trTria) return false ; // Translate triangle as conceptually moving AABB to origin - Point3d ptV0 = trTria.GetP( 0) - ( ptCen - ORIG) ; - Point3d ptV1 = trTria.GetP( 1) - ( ptCen - ORIG) ; - Point3d ptV2 = trTria.GetP( 2) - ( ptCen - ORIG) ; + Point3d ptV0 = trTriaL.GetP( 0) - ( ptCen - ORIG) ; + Point3d ptV1 = trTriaL.GetP( 1) - ( ptCen - ORIG) ; + Point3d ptV2 = trTriaL.GetP( 2) - ( ptCen - ORIG) ; // Compute edge vectors for triangle Vector3d vtE0 = ptV1 - ptV0 ; @@ -148,6 +156,6 @@ CDeBoxTria( const BBox3d& b3Box, const Triangle3d& trTria) // Test separating axis corresponding to triangle face normal (category 2) Plane3d Plane ; - Plane.Set( trTria.GetP( 0), trTria.GetN()) ; + Plane.Set( trTriaL.GetP( 0), trTriaL.GetN()) ; return CDeBoxPlane( b3Box, Plane) ; } diff --git a/CDeCylClosedSurfTm.cpp b/CDeCylClosedSurfTm.cpp new file mode 100644 index 0000000..b9e6ca8 --- /dev/null +++ b/CDeCylClosedSurfTm.cpp @@ -0,0 +1,48 @@ +//---------------------------------------------------------------------------- +// EgalTech 2020-2020 +//---------------------------------------------------------------------------- +// File : CDCylSurfTm.cpp Data : 09.01.20 Versione : 2.2a2 +// Contenuto : Implementazione della verifica di collisione tra +// Cylinder e Closed SurftriMesh. +// +// +// Modifiche : 09.01.20 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "/EgtDev/Include/EGkCDeCylTria.h" +#include "/EgtDev/Include/EGkCDeCylClosedSurfTm.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +bool +CDeCylClosedSurfTm( const Frame3d& frCyl, double dH, double dR, double dSafeDist, const ISurfTriMesh& Stm) +{ + // verifico che la trimesh sia effettivamente chiusa (un poliedro) + if ( ! Stm.IsClosed()) + return false ; + // recupero BBox del poliedro + BBox3d b3Poly = Stm.GetAllTriaBox() ; + // calcolo il BBox del cilindro + BBox3d b3Cyl( ORIG, dR, dR, dH) ; + b3Cyl.Expand( dSafeDist) ; + b3Cyl.ToGlob( frCyl) ; + // confronto i due Box + if ( ! b3Cyl.Overlaps( b3Poly)) + return false ; + // recupero i triangoli che interferiscono con il box del Cilindro + INTVECTOR vT ; + Stm.GetAllTriaOverlapBox( b3Cyl, vT) ; + for ( int nT : vT) { + Triangle3d Tria ; + if ( Stm.GetTriangle( nT, Tria)) { + if ( CDeCylTria( frCyl, dH, dR, dSafeDist, Tria)) + return true ; + } + } + return false ; +} diff --git a/CDeCylTria.cpp b/CDeCylTria.cpp new file mode 100644 index 0000000..5849c43 --- /dev/null +++ b/CDeCylTria.cpp @@ -0,0 +1,66 @@ +//---------------------------------------------------------------------------- +// EgalTech 2020-2020 +//---------------------------------------------------------------------------- +// File : CDeCylTria.cpp Data : 08.01.20 Versione : 2.2a2 +// Contenuto : Implementazione della verifica di collisione tra +// Cylinder e Triangle3d. +// +// +// Modifiche :08.01.20 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "DistPointLine.h" +#include "/EgtDev/Include/EGkCDeCylTria.h" +#include "/EgtDev/Include/EGkPolygon3d.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +bool +CDeCylTria( const Frame3d& frCyl, double dH, double dR, double dSafeDist, const Triangle3d& trTria) +{ + // Costruisco il poligono equivalente + Polygon3d plyTria ; + if ( ! plyTria.FromTriangle( trTria)) + return false ; + // Lo porto nel riferimento del cilindro + plyTria.ToLoc( frCyl) ; + // Lo taglio come il cilindro (ingrossato della sicurezza) + Plane3d plTrimB ; + plTrimB.Set( dSafeDist, -Z_AX) ; + plyTria.Trim( plTrimB, true, false) ; + Plane3d plTrimT ; + plTrimT.Set( dH + dSafeDist, Z_AX) ; + plyTria.Trim( plTrimB, true, false) ; + // Se non è rimasto alcunchè, allora non c'è collisione + if ( plyTria.GetSideCount() == 0) + return false ; + // Proietto il poligono sul piano XY + plyTria.Scale( GLOB_FRM, 1, 1, 0) ; + // Verifico che sia orientato verso l'alto + if ( plyTria.GetVersN().z < - EPS_SMALL) + plyTria.Invert() ; + // Determino la distanza con segno dei lati del poligono dall'origine del piano + const PNTVECTOR& vVert = plyTria.GetVertices() ; + for ( int i = 0 ; i < int( vVert.size()) ; ++ i) { + int j = ( i + 1) % vVert.size() ; + DistPointLine dstPL( ORIG, vVert[i], vVert[j]) ; + double dDist ; + if ( dstPL.GetDist( dDist)) { + // se distanza minore del raggio, allora collide + if ( dDist < dR + dSafeDist) + return true ; + Point3d ptMinDist ; + dstPL.GetMinDistPoint( ptMinDist) ; + // se sta a destra del raggio, allora non collide + if ( CrossXY( ( ORIG - ptMinDist), ( vVert[j] - vVert[i])) > 0) + return false ; + } + } + + return false ; +} diff --git a/CDeSpheClosedSurfTm.cpp b/CDeSpheClosedSurfTm.cpp new file mode 100644 index 0000000..815d5e9 --- /dev/null +++ b/CDeSpheClosedSurfTm.cpp @@ -0,0 +1,47 @@ +//---------------------------------------------------------------------------- +// 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 "/EgtDev/Include/EGkCDeSpheTria.h" +#include "/EgtDev/Include/EGkCDeSpheClosedSurfTm.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +bool +CDeSpheClosedSurfTm( const Point3d& ptCen, double dR, double dSafeDist, const ISurfTriMesh& Stm) +{ + // verifico che la trimesh sia effettivamente chiusa (un poliedro) + if ( ! Stm.IsClosed()) + return false ; + // recupero BBox del poliedro + BBox3d b3Poly = Stm.GetAllTriaBox() ; + // calcolo il BBox della sfera + BBox3d b3Sphe( ptCen, dR) ; + b3Sphe.Expand( dSafeDist) ; + // confronto i due Box + if ( ! b3Sphe.Overlaps( b3Poly)) + return false ; + // recupero i triangoli che interferiscono con il box della Sfera + INTVECTOR vT ; + Stm.GetAllTriaOverlapBox( b3Sphe, vT) ; + for ( int nT : vT) { + Triangle3d Tria ; + if ( Stm.GetTriangle( nT, Tria)) { + if ( CDeSpheTria( ptCen, dR, dSafeDist, Tria)) + return true ; + } + } + return false ; +} diff --git a/CDeSpheTria.cpp b/CDeSpheTria.cpp new file mode 100644 index 0000000..f7f2cde --- /dev/null +++ b/CDeSpheTria.cpp @@ -0,0 +1,30 @@ +//---------------------------------------------------------------------------- +// EgalTech 2020-2020 +//---------------------------------------------------------------------------- +// File : CDeSpheTria.cpp Data : 09.01.20 Versione : 2.2a2 +// Contenuto : Implementazione della verifica di collisione tra +// Sphere e Triangle3d. +// +// +// Modifiche :09.01.20 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "/EgtDev/Include/EGkCDeSpheTria.h" +#include "/EgtDev/Include/EGkDistPointTria.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +bool +CDeSpheTria( const Point3d& ptCen, double dR, double dSafeDist, const Triangle3d& trTria) +{ + // Determino la minima distanza tra centro della sfera e triangolo + double dDist ; + if ( ! DistPointTriangle( ptCen, trTria).GetDist( dDist)) + return false ; + return ( dDist < dR + dSafeDist) ; +} diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index d5e8537..3e71516 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -270,8 +270,12 @@ copy $(TargetPath) \EgtProg\Dll64 - + + + + + @@ -392,13 +396,17 @@ copy $(TargetPath) \EgtProg\Dll64 - + - + + + + + @@ -416,6 +424,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters index 2b8bb21..63c70d3 100644 --- a/EgtGeomKernel.vcxproj.filters +++ b/EgtGeomKernel.vcxproj.filters @@ -375,9 +375,6 @@ File di origine\GeoCollision - - File di origine\GeoCollision - File di origine\GeoCollision @@ -399,6 +396,21 @@ File di origine\Geo + + File di origine\GeoCollision + + + File di origine\GeoCollision + + + File di origine\GeoCollision + + + File di origine\GeoCollision + + + File di origine\GeoCollision + @@ -737,9 +749,6 @@ File di intestazione\Include - - File di intestazione\Include - File di intestazione\Include @@ -872,9 +881,6 @@ File di intestazione\Include - - File di intestazione\Include - File di intestazione\Include @@ -956,6 +962,27 @@ File di intestazione + + File di intestazione\Include + + + File di intestazione\Include + + + File di intestazione\Include + + + File di intestazione\Include + + + File di intestazione\Include + + + File di intestazione\Include + + + File di intestazione\Include + diff --git a/Polygon3d.cpp b/Polygon3d.cpp index 5cd9692..78b4188 100644 --- a/Polygon3d.cpp +++ b/Polygon3d.cpp @@ -53,6 +53,25 @@ Polygon3d::FromRectangle( double dDimX, double dDimY) return true ; } +//---------------------------------------------------------------------------- +bool +Polygon3d::FromTriangle( const Triangle3d& trTria) +{ + // annullo il piano del poligono + m_Plane.Reset() ; + // verifico che il triangolo sia valido + if ( ! trTria.IsValid()) + return false ; + // assegno il piano + m_Plane.Set( trTria.GetP( 0), trTria.GetN()) ; + // assegno i punti + m_vVert.emplace_back( trTria.GetP( 0)) ; + m_vVert.emplace_back( trTria.GetP( 1)) ; + m_vVert.emplace_back( trTria.GetP( 2)) ; + + return true ; +} + //---------------------------------------------------------------------------- bool Polygon3d::FromPolyLine( const PolyLine& PL) @@ -152,7 +171,7 @@ Polygon3d::Trim( const Plane3d& plPlane, bool bInVsOut, bool bOnEq) // determino se normali equiverse bool bEquivNormal = ( m_Plane.GetVersN() * plPlane.GetVersN() > 0) ; // se relazione tra normali opposta al desiderato, lo annullo - if ( bOnEq != bEquivNormal) + if ( bOnEq != bEquivNormal) m_vVert.clear() ; return true ; }