qCC_db version 2.13.alpha (Qt) - 31 May 2022
CloudCompare 3D entities
|
Public Types | |
enum | OctreeCellVisibility { CELL_OUTSIDE_FRUSTUM = 0 , CELL_INSIDE_FRUSTUM = 1 , CELL_INTERSECT_FRUSTUM = 2 } |
Definition of the state of a cell compared to a frustum. More... | |
Public Member Functions | |
ccOctreeFrustumIntersector () | |
Default constructor. | |
bool | build (CCCoreLib::DgmOctree *octree) |
Prepares structure for frustum filtering. | |
OctreeCellVisibility | positionFromFrustum (CCCoreLib::DgmOctree::CellCode truncatedCode, unsigned char level) const |
Returns the cell visibility. | |
void | computeFrustumIntersectionWithOctree (std::vector< std::pair< unsigned, CCVector3 > > &pointsToTest, std::vector< unsigned > &inCameraFrustum, const float planesCoefficients[6][4], const CCVector3 ptsFrustum[8], const CCVector3 edges[6], const CCVector3 ¢er) |
Compute intersection between the octree and a frustum and send back the indices of 3D points inside the frustum or in cells intersecting it. More... | |
void | computeFrustumIntersectionByLevel (unsigned char level, CCCoreLib::DgmOctree::CellCode parentTruncatedCode, OctreeCellVisibility parentResult, const float planesCoefficients[6][4], const CCVector3 ptsFrustum[8], const CCVector3 edges[6], const CCVector3 ¢er) |
Compute intersection between the octree and the height children cells of a parent cell. More... | |
OctreeCellVisibility | separatingAxisTest (const CCVector3 &bbMin, const CCVector3 &bbMax, const float planesCoefficients[6][4], const CCVector3 frustumCorners[8], const CCVector3 frustumEdges[6], const CCVector3 &frustumCenter) |
Separating Axis Test. More... | |
Definition of the state of a cell compared to a frustum.
OUTSIDE : the celle is completely outside the frustum (no intersection, no inclusion) INSIDE : the cell is completely inside the frustum INTERSECT : other cases --> the frustum is completely inside the cell OR the frustum and the cell have an intersection
void ccOctreeFrustumIntersector::computeFrustumIntersectionByLevel | ( | unsigned char | level, |
CCCoreLib::DgmOctree::CellCode | parentTruncatedCode, | ||
OctreeCellVisibility | parentResult, | ||
const float | planesCoefficients[6][4], | ||
const CCVector3 | ptsFrustum[8], | ||
const CCVector3 | edges[6], | ||
const CCVector3 & | center | ||
) |
Compute intersection between the octree and the height children cells of a parent cell.
level | current level |
parentTruncatedCode | truncated code of the parent cell (at level-1) |
parentResult | contains in which class the parent cell has been classified (OUTSIDE, INTERSECTING, INSIDE) |
planesCoefficients | coefficients (a, b, c and d) of the six frustum planes (0:right, 1:bottom, 2:left, 3:top, 4:near, 5:far) |
ptsFrustum | 3D coordinates of the eight corners of the frustum (global coordinates system) |
edges | 3D coordinates (global coordinates system) of the six director vector of the frustum edges |
center | 3D coordinates of the frustum center (global coordinates system) ; this is the center of the circumscribed sphere |
void ccOctreeFrustumIntersector::computeFrustumIntersectionWithOctree | ( | std::vector< std::pair< unsigned, CCVector3 > > & | pointsToTest, |
std::vector< unsigned > & | inCameraFrustum, | ||
const float | planesCoefficients[6][4], | ||
const CCVector3 | ptsFrustum[8], | ||
const CCVector3 | edges[6], | ||
const CCVector3 & | center | ||
) |
Compute intersection between the octree and a frustum and send back the indices of 3D points inside the frustum or in cells intersecting it.
Every cells of each level of the octree will be classified as INSIDE, OUTSIDE or INTERSECTING the frustum. Their truncated code are then stored in m_cellsInFrustum (for cells INSIDE) or m_cellsIntersectFrustum (for cells INTERSECTING).
pointsToTest | contains the indice and 3D position (global coordinates system) of every 3D points stored in an INTERSECTING cell |
inCameraFrustum | contains the indice of every 3D points stored in an INSIDE cell |
planesCoefficients | coefficients (a, b, c and d) of the six frustum planes (0:right, 1:bottom, 2:left, 3:top, 4:near, 5:far) |
ptsFrustum | 3D coordinates of the eight corners of the frustum (global coordinates system) |
edges | 3D coordinates (global coordinates system) of the six director vector of the frustum edges |
center | 3D coordinates of the frustum center (global coordinates system) ; this is the center of the circumscribed sphere |
ccOctreeFrustumIntersector::OctreeCellVisibility ccOctreeFrustumIntersector::separatingAxisTest | ( | const CCVector3 & | bbMin, |
const CCVector3 & | bbMax, | ||
const float | planesCoefficients[6][4], | ||
const CCVector3 | frustumCorners[8], | ||
const CCVector3 | frustumEdges[6], | ||
const CCVector3 & | frustumCenter | ||
) |
Separating Axis Test.
See "Detecting intersection of a rectangular solid and a convex polyhedron" of Ned Greene See "OBBTree: A Hierarchical Structure for Rapid Interference Detection" of S. Gottschalk, M. C. Lin and D. Manocha
bbMin | minimum coordinates of the cell |
bbMax | maximum coordinates of the cell |
planesCoefficients | coefficients (a, b, c and d) of the six frustum planes (0:right, 1:bottom, 2:left, 3:top, 4:near, 5:far) |
frustumCorners | 3D coordinates of the eight corners of the frustum (global coordinates system) |
frustumEdges | 3D coordinates (global coordinates system) of the six director vector of the frustum edges |
frustumCenter | 3D coordinates of the frustum center (global coordinates system) ; this is the center of the circumscribed sphere |