- PreCollisionLib rivista per testare costruire trimesh da punti e usare funzione EgtTestSurfaceSurface per verificare collisione

This commit is contained in:
luca.mazzoleni
2025-12-01 12:44:23 +01:00
parent 530dce3d0d
commit d5b4edea14
+51 -82
View File
@@ -7,6 +7,7 @@ local PreCollisionLib = {}
-- Include
require( 'EgtBase')
local BeamLib = require( 'BeamLib')
local BeamData = require( 'BeamData')
-- Carico i dati globali
@@ -15,24 +16,8 @@ EgtOutLog( ' PreCollisionLib started', 1)
-------------------------------------------------------------------------------------------------------------
-- costruzione flat region del pezzo nel piano scelto
local function GetPartSurfFrInPlane( Part, vtDirection)
-- si estrae prima la silhouette nel piano
local idFirstCurve, nCurveCount = EgtGetSurfTmSilhouette( Part.idBoxTm, vtDirection, 10 * GEO.EPS_SMALL, Part.idTempGroup, GDB_RT.GLOB)
-- se più curve c'è qualcosa che non va: errore
if nCurveCount > 1 then
error( 'GetPartSurfFrInPlane : error in part box')
end
-- creazione flat region dalla silhouette
local idPartSurfFr = EgtSurfFlatRegion( Part.idTempGroup, idFirstCurve)
return idPartSurfFr
end
-------------------------------------------------------------------------------------------------------------
-- costruzione flat region del grezzo restante nel piano scelto (con leggera sovrapposizione)
local function GetRestlengthSurfFrInPlane( Part, vtDirection)
-- costruzione trimesh del grezzo restante (con leggera sovrapposizione)
local function GetRestlengthSurfTm( Part)
-- si costruisce il box in globale
local ptRestLengthMax = Point3d( Part.b3Part:getMin()) + X_AX() * 500 * GEO.EPS_SMALL
@@ -40,16 +25,8 @@ local function GetRestlengthSurfFrInPlane( Part, vtDirection)
local b3RestLength = BBox3d( ptRestLengthMin, ptRestLengthMax)
-- si crea la trimesh dal box
local idRestLengthBoxTm = EgtSurfTmBBox( Part.idTempGroup, b3RestLength , false, GDB_RT.GLOB)
-- si estrae la silhouette nel piano
local idFirstCurve, nCurveCount = EgtGetSurfTmSilhouette( idRestLengthBoxTm, vtDirection, 10 * GEO.EPS_SMALL, Part.idTempGroup, GDB_RT.GLOB)
-- se più curve c'è qualcosa che non va: errore
if nCurveCount > 1 then
error( 'Error in part box')
end
-- creazione flat region dalla silhouette
local idRestlengthSurfFr = EgtSurfFlatRegion( Part.idTempGroup, idFirstCurve)
return idRestlengthSurfFr
return idRestLengthBoxTm
end
-------------------------------------------------------------------------------------------------------------
@@ -147,74 +124,66 @@ function PreCollisionLib.CheckCollisionWithAxis( sAxis, Edge, vtNFace, vtHead, P
-- se non si trova collisione si ritorna se è necessario separare prima di effettuare la lavorazione (ossia non c'è collisione con il pezzo ma c'è con il grezzo restante)
for i = 1, #ToolExitPoints do
local nCollisionCountPiece = 0
local nCollisionCountRestlength = 0
local ptPivot = GetGlobalPivot( ToolExitPoints[i], vtToolSCC, vtHead, PreCollisionData.vtMovePivot)
for j = 1, #PreCollisionData do
-- orientamento del riferimento locale
local vtDirectionX = PreCollisionData.Directions.vtDirectionX
local vtDirectionY = PreCollisionData.Directions.vtDirectionY
local vtDirectionZ = PreCollisionData.Directions.vtDirectionZ
-- costruzione trimesh a partire dalla curva di collisione
-- recupero punti da macchina per costruire trimesh
local CollisionCurvePoints = PreCollisionData.Points
-- curva di collisione in riferimento locale
local idCollisionCurve = EgtCurveCompoFromPoints( Part.idTempGroup, CollisionCurvePoints)
-- curva in riferimento globale
local frReference = Frame3d( ptPivot, vtDirectionZ, vtDirectionX)
EgtTransform( idCollisionCurve, frReference, GDB_RT.GLOB)
-- trimesh di collisione
local idCollisionSurfTm
if PreCollisionData.bSurfTmByRevolve then
idCollisionSurfTm = EgtSurfTmByRevolve( Part.idTempGroup, idCollisionCurve, ptPivot, vtDirectionY, true, 0.05, GDB_RT.GLOB)
else
local vtPreMove = -vtDirectionZ * ( PreCollisionData.dExtrusionDepth / 2)
EgtMove( idCollisionCurve, vtPreMove, GDB_RT.GLOB)
local vtExtrusion = vtDirectionZ * PreCollisionData.dExtrusionDepth
idCollisionSurfTm = EgtSurfTmByRegionExtrusion( Part.idTempGroup, idCollisionCurve, vtExtrusion, 0.05, GDB_RT.GLOB)
end
-- pivot in globale
local ptPivot = GetGlobalPivot( ToolExitPoints[i], vtToolSCC, vtHead, PreCollisionData[j].vtMovePivot)
-- check collisione con pezzo
local bCollisionFoundPiece = false
-- orientamento del riferimento locale
local vtDirectionX = PreCollisionData[j].Directions.vtDirectionX
local vtDirectionZ = PreCollisionData[j].Directions.vtDirectionZ
-- costruzione flat region della curva di collisione nel piano scelto
-- recupero punti da macchina per costruire flat region
local CollisionCurvePoints = PreCollisionData[j].Points
-- curva di collisione in riferimento locale
local idCollisionCurve = EgtCurveCompoFromPoints( Part.idTempGroup, CollisionCurvePoints)
-- curva in riferimento globale
local frReference = Frame3d( ptPivot, vtDirectionZ, vtDirectionX)
EgtTransform( idCollisionCurve, frReference, GDB_RT.GLOB )
-- flat region di collisione
local idCollisionSurfFr = EgtSurfFlatRegion( Part.idTempGroup, idCollisionCurve)
bCollisionFoundPiece = EgtTestSurfaceSurface( Part.idBoxTm, idCollisionSurfTm, BeamData.COLL_SIC)
if not type( bCollisionFoundPiece) == "boolean" then
error( 'EgtTestSurfaceSurface fail')
end
-- check collisione con pezzo (per la collisione deve esserci intersezione su tutti e 3 i piani)
-- si controlla solo se nelle direzioni precedenti è stata trovata collisione col pezzo,
-- altrimenti significa che non si è usciti dal ciclo solamente per la collisione con grezzo per restituire bMoveAfterSplit
local bCollisionFoundPiece = false
if nCollisionCountPiece == j - 1 then
local idPartSurfFr = GetPartSurfFrInPlane( Part, vtDirectionZ)
if EgtGetDebugLevel() >= 3 and bCollisionFoundPiece then
EgtSetColor( idCollisionSurfTm, RED())
end
bCollisionFoundPiece = not EgtSurfFrTestExternal( idPartSurfFr, idCollisionSurfFr)
-- check collisione con grezzo restante, se con il pezzo non c'è collisione
local bCollisionFoundRestLength = false
if not bCollisionFoundPiece then
local idRestLengthSurfFr = GetRestlengthSurfTm( Part, vtDirectionZ)
if EgtGetDebugLevel() >= 3 and bCollisionFoundPiece then
EgtSetColor( idCollisionSurfFr, RED())
end
bCollisionFoundRestLength = EgtTestSurfaceSurface( idRestLengthSurfFr, idCollisionSurfTm, BeamData.COLL_SIC)
if not type( bCollisionFoundRestLength) == "boolean" then
error( 'EgtTestSurfaceSurface fail')
end
-- check collisione con grezzo restante, se con il pezzo non c'è collisione
local bCollisionFoundRestLength = false
if not bCollisionFoundPiece then
local idRestLengthSurfFr = GetRestlengthSurfFrInPlane( Part, vtDirectionZ)
bCollisionFoundRestLength = not EgtSurfFrTestExternal( idRestLengthSurfFr, idCollisionSurfFr)
if EgtGetDebugLevel() >= 3 and bCollisionFoundRestLength then
EgtSetColor( idCollisionSurfFr, ORANGE())
end
if EgtGetDebugLevel() >= 3 and bCollisionFoundRestLength then
EgtSetColor( idCollisionSurfTm, ORANGE())
end
-- se non trovata collisione si passa al punto successivo
if not ( bCollisionFoundPiece or bCollisionFoundRestLength) then
nCollisionCountPiece = 0
nCollisionCountRestlength = 0
break
-- altrimenti si aggiorna il numero di collisioni con pezzo e con grezzo restante
elseif bCollisionFoundPiece then
nCollisionCountPiece = nCollisionCountPiece + 1
elseif bCollisionFoundRestLength then
nCollisionCountRestlength = nCollisionCountRestlength + 1
if bCollisionFoundRestLength then
bMoveAfterSplit = true
end
end
-- collisione trovata
if nCollisionCountPiece == #PreCollisionData then
return true, nil
-- nessuna collisione trovata con pezzo ma serve separazione
elseif nCollisionCountRestlength == #PreCollisionData then
bMoveAfterSplit = true
-- se trovata collisione con pezzo si esce subito
if bCollisionFoundPiece then
return true
end
end