Eigen-unsupported  5.0.1-dev
 
Loading...
Searching...
No Matches
BVH
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2009 Ilya Baran <ibaran@mit.edu>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_BVH_MODULE_H
11#define EIGEN_BVH_MODULE_H
12
13#include "../../Eigen/Core"
14#include "../../Eigen/Geometry"
15#include "../../Eigen/StdVector"
16#include <algorithm>
17#include <queue>
18
19namespace Eigen {
20
21/**
22 * \defgroup BVH_Module BVH module
23 * \brief This module provides generic bounding volume hierarchy algorithms
24 * and reference tree implementations.
25 *
26 *
27 * \code
28 * #include <unsupported/Eigen/BVH>
29 * \endcode
30 *
31 * A bounding volume hierarchy (BVH) can accelerate many geometric queries. This module provides a generic
32 implementation
33 * of the two basic algorithms over a BVH: intersection of a query object against all objects in the hierarchy and
34 minimization
35 * of a function over the objects in the hierarchy. It also provides intersection and minimization over a cartesian
36 product of
37 * two BVH's. A BVH accelerates intersection by using the fact that if a query object does not intersect a volume,
38 then it cannot
39 * intersect any object contained in that volume. Similarly, a BVH accelerates minimization because the minimum of a
40 function
41 * over a volume is no greater than the minimum of a function over any object contained in it.
42 *
43 * Some sample queries that can be written in terms of intersection are:
44 * - Determine all points where a ray intersects a triangle mesh
45 * - Given a set of points, determine which are contained in a query sphere
46 * - Given a set of spheres, determine which contain the query point
47 * - Given a set of disks, determine if any is completely contained in a query rectangle (represent each 2D disk as a
48 point \f$(x,y,r)\f$
49 * in 3D and represent the rectangle as a pyramid based on the original rectangle and shrinking in the \f$r\f$
50 direction)
51 * - Given a set of points, count how many pairs are \f$d\pm\epsilon\f$ apart (done by looking at the cartesian
52 product of the set
53 * of points with itself)
54 *
55 * Some sample queries that can be written in terms of function minimization over a set of objects are:
56 * - Find the intersection between a ray and a triangle mesh closest to the ray origin (function is infinite off the
57 ray)
58 * - Given a polyline and a query point, determine the closest point on the polyline to the query
59 * - Find the diameter of a point cloud (done by looking at the cartesian product and using negative distance as the
60 function)
61 * - Determine how far two meshes are from colliding (this is also a cartesian product query)
62 *
63 * This implementation decouples the basic algorithms both from the type of hierarchy (and the types of the bounding
64 volumes) and
65 * from the particulars of the query. To enable abstraction from the BVH, the BVH is required to implement a generic
66 mechanism
67 * for traversal. To abstract from the query, the query is responsible for keeping track of results.
68 *
69 * To be used in the algorithms, a hierarchy must implement the following traversal mechanism (see KdBVH for a sample
70 implementation): \code typedef Volume //the type of bounding volume typedef Object //the type of object in the
71 hierarchy typedef Index //a reference to a node in the hierarchy--typically an int or a pointer typedef
72 VolumeIterator //an iterator type over node children--returns Index typedef ObjectIterator //an iterator over object
73 (leaf) children--returns const Object & Index getRootIndex() const //returns the index of the hierarchy root const
74 Volume &getVolume(Index index) const //returns the bounding volume of the node at given index void getChildren(Index
75 index, VolumeIterator &outVBegin, VolumeIterator &outVEnd, ObjectIterator &outOBegin, ObjectIterator &outOEnd) const
76 //getChildren takes a node index and makes [outVBegin, outVEnd) range over its node children
77 //and [outOBegin, outOEnd) range over its object children
78 \endcode
79 *
80 * To use the hierarchy, call BVIntersect or BVMinimize, passing it a BVH (or two, for cartesian product) and a
81 minimizer or intersector.
82 * For an intersection query on a single BVH, the intersector encapsulates the query and must provide two functions:
83 * \code
84 bool intersectVolume(const Volume &volume) //returns true if the query intersects the volume
85 bool intersectObject(const Object &object) //returns true if the intersection search should terminate immediately
86 \endcode
87 * The guarantee that BVIntersect provides is that intersectObject will be called on every object whose bounding volume
88 * intersects the query (but possibly on other objects too) unless the search is terminated prematurely. It is the
89 * responsibility of the intersectObject function to keep track of the results in whatever manner is appropriate.
90 * The cartesian product intersection and the BVMinimize queries are similar--see their individual documentation.
91 *
92 * The following is a simple but complete example for how to use the BVH to accelerate the search for a closest
93 red-blue point pair:
94 * \include BVH_Example.cpp
95 * Output: \verbinclude BVH_Example.out
96 */
97}
98
99//@{
100
101// IWYU pragma: begin_exports
102#include "src/BVH/BVAlgorithms.h"
103#include "src/BVH/KdBVH.h"
104// IWYU pragma: end_exports
105
106//@}
107
108#endif // EIGEN_BVH_MODULE_H