fba63ea82e
- aggiunte funzioni per verifica collisione tra Box, Cilindro e Sfera con Superfici triMesh chiuse - aggiunta costruzione di Polygon3d da triangolo.
67 lines
2.4 KiB
C++
67 lines
2.4 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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 ;
|
|
}
|