Broad Phase¶
Broad Phase¶
- class BroadPhase;¶
Inheritance diagram for ipc::BroadPhase:
Base class for broad phase collision detection methods.
Subclassed by ipc::BVH, ipc::BruteForce, ipc::HashGrid, ipc::LBVH, ipc::SpatialHash, ipc::SweepAndPrune
Public Functions¶
- inline virtual ~BroadPhase();¶
- virtual std::string name() const = 0;¶
Get the name of the broad phase method.
- Returns:¶
The name of the broad phase method.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for static collision detection.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- const double inflation_radius = 0¶
Radius of inflation around all elements.
-
virtual void build(const AABBs& vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, const uint8_t dim);¶ Build the broad phase for collision detection.
- virtual void clear();¶
Clear any built data.
- void detect_collision_candidates(Candidates& candidates) const;¶
Detect all collision candidates needed for a given dimensional simulation.
- Parameters:¶
- Candidates &candidates¶
The detected collision candidates.
-
virtual void detect_vertex_vertex_candidates(
std::vector<VertexVertexCandidate>& candidates) const
= 0;¶ Find the candidate vertex-vertex collisions.
- Parameters:¶
- std::vector<VertexVertexCandidate> &candidates¶
[out] The candidate vertex-vertex collisions.
-
virtual void detect_edge_vertex_candidates(
std::vector<EdgeVertexCandidate>& candidates) const
= 0;¶ Find the candidate edge-vertex collisions.
- Parameters:¶
- std::vector<EdgeVertexCandidate> &candidates¶
[out] The candidate edge-vertex collisions.
-
virtual void detect_edge_edge_candidates(
std::vector<EdgeEdgeCandidate>& candidates) const
= 0;¶ Find the candidate edge-edge collisions.
- Parameters:¶
- std::vector<EdgeEdgeCandidate> &candidates¶
[out] The candidate edge-edge collisions.
-
virtual void detect_face_vertex_candidates(
std::vector<FaceVertexCandidate>& candidates) const
= 0;¶ Find the candidate face-vertex collisions.
- Parameters:¶
- std::vector<FaceVertexCandidate> &candidates¶
[out] The candidate face-vertex collisions.
-
virtual void detect_edge_face_candidates(
std::vector<EdgeFaceCandidate>& candidates) const
= 0;¶ Find the candidate edge-face intersections.
- Parameters:¶
- std::vector<EdgeFaceCandidate> &candidates¶
[out] The candidate edge-face intersections.
-
virtual void detect_face_face_candidates(
std::vector<FaceFaceCandidate>& candidates) const
= 0;¶ Find the candidate face-face collisions.
Public Members¶
-
std::function<bool(size_t, size_t)> can_vertices_collide
= default_can_vertices_collide;¶ Function for determining if two vertices can collide.
Protected Functions¶
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces);¶ Build the broad phase for collision detection.
Note
Assumes the vertex_boxes have been built.
Brute Force¶
- class BruteForce : public ipc::BroadPhase;¶
Inheritance diagram for ipc::BruteForce:
Collaboration diagram for ipc::BruteForce:
Brute force broad phase collision detection.
Public Functions¶
- BruteForce() = default;¶
- inline virtual std::string name() const override;¶
Get the name of the broad phase method.
- Returns:¶
The name of the broad phase method.
-
virtual void detect_vertex_vertex_candidates(
std::vector<VertexVertexCandidate>& candidates) const override;¶ Find the candidate vertex-vertex collisions.
- Parameters:¶
- std::vector<VertexVertexCandidate> &candidates¶
[out] The candidate vertex-vertex collisions.
-
virtual void detect_edge_vertex_candidates(
std::vector<EdgeVertexCandidate>& candidates) const override;¶ Find the candidate edge-vertex collisions.
- Parameters:¶
- std::vector<EdgeVertexCandidate> &candidates¶
[out] The candidate edge-vertex collisions.
-
virtual void detect_edge_edge_candidates(
std::vector<EdgeEdgeCandidate>& candidates) const override;¶ Find the candidate edge-edge collisions.
- Parameters:¶
- std::vector<EdgeEdgeCandidate> &candidates¶
[out] The candidate edge-edge collisions.
-
virtual void detect_face_vertex_candidates(
std::vector<FaceVertexCandidate>& candidates) const override;¶ Find the candidate face-vertex collisions.
- Parameters:¶
- std::vector<FaceVertexCandidate> &candidates¶
[out] The candidate face-vertex collisions.
-
virtual void detect_edge_face_candidates(
std::vector<EdgeFaceCandidate>& candidates) const override;¶ Find the candidate edge-face intersections.
- Parameters:¶
- std::vector<EdgeFaceCandidate> &candidates¶
[out] The candidate edge-face intersections.
-
virtual void detect_face_face_candidates(
std::vector<FaceFaceCandidate>& candidates) const override;¶ Find the candidate face-face collisions.
Private Functions¶
-
template <typename Candidate, bool triangular = false>
void detect_candidates(const AABBs& boxes0, const AABBs& boxes1,
const std::function<bool(size_t, size_t)>& can_collide,
std::vector<Candidate>& candidates) const;¶ Detect candidates for collisions between two sets of boxes.
Hash Grid¶
- class HashGrid : public ipc::BroadPhase;¶
Inheritance diagram for ipc::HashGrid:
Collaboration diagram for ipc::HashGrid:
Hash grid broad phase collision detection.
Public Functions¶
- HashGrid() = default;¶
- inline virtual std::string name() const override;¶
Get the name of the broad phase method.
- Returns:¶
The name of the broad phase method.
- inline virtual void clear() override;¶
Clear the hash grid.
-
virtual void detect_vertex_vertex_candidates(
std::vector<VertexVertexCandidate>& candidates) const override;¶ Find the candidate vertex-vertex collisions.
-
virtual void detect_edge_vertex_candidates(
std::vector<EdgeVertexCandidate>& candidates) const override;¶ Find the candidate edge-vertex collisions.
- Parameters:¶
- std::vector<EdgeVertexCandidate> &candidates¶
[out] The candidate edge-vertex collisions.
-
virtual void detect_edge_edge_candidates(
std::vector<EdgeEdgeCandidate>& candidates) const override;¶ Find the candidate edge-edge collisions.
- Parameters:¶
- std::vector<EdgeEdgeCandidate> &candidates¶
[out] The candidate edge-edge collisions.
-
virtual void detect_face_vertex_candidates(
std::vector<FaceVertexCandidate>& candidates) const override;¶ Find the candidate face-vertex collisions.
- Parameters:¶
- std::vector<FaceVertexCandidate> &candidates¶
[out] The candidate face-vertex collisions.
-
virtual void detect_edge_face_candidates(
std::vector<EdgeFaceCandidate>& candidates) const override;¶ Find the candidate edge-face intersections.
- Parameters:¶
- std::vector<EdgeFaceCandidate> &candidates¶
[out] The candidate edge-face intersections.
-
virtual void detect_face_face_candidates(
std::vector<FaceFaceCandidate>& candidates) const override;¶ Find the candidate face-face collisions.
- inline double cell_size() const;¶
- inline const Eigen::Array3i& grid_size() const;¶
- inline const Eigen::Array3d& domain_min() const;¶
- inline const Eigen::Array3d& domain_max() const;¶
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for static collision detection.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- const double inflation_radius = 0¶
Radius of inflation around all elements.
-
virtual void build(const AABBs& vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, const uint8_t dim);¶ Build the broad phase for collision detection.
Protected Functions¶
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces) override; Build the broad phase for collision detection.
Note
Assumes the vertex_boxes have been built.
-
void resize(Eigen::ConstRef<Eigen::Array3d> domain_min,
Eigen::ConstRef<Eigen::Array3d> domain_max, double cell_size);¶
- void insert_boxes();¶
Protected Attributes¶
- double m_cell_size = -1;¶
- Eigen::Array3i m_grid_size;¶
- Eigen::Array3d m_domain_min;¶
- Eigen::Array3d m_domain_max;¶
- std::vector<HashItem> vertex_items;¶
- std::vector<HashItem> edge_items;¶
- std::vector<HashItem> face_items;¶
Private Functions¶
-
template <typename Candidate>
void detect_candidates(const std::vector<HashItem>& items0,
const std::vector<HashItem>& items1, const AABBs& boxes0,
const AABBs& boxes1,
const std::function<bool(size_t, size_t)>& can_collide,
std::vector<Candidate>& candidates) const;¶ Find the candidate collisions between two sets of items.
- Template Parameters:¶
- typename Candidate¶
The type of collision candidate.
- Parameters:¶
- const std::vector<HashItem> &items0¶
[in] First set of items.
- const std::vector<HashItem> &items1¶
[in] Second set of items.
- const AABBs &boxes0¶
[in] First set’s boxes.
- const AABBs &boxes1¶
[in] Second set’s boxes.
- const std::function<bool(size_t, size_t)> &can_collide¶
[in] Function to determine if two items can collide.
- std::vector<Candidate> &candidates¶
[out] The candidate collisions.
-
template <typename Candidate>
void detect_candidates(const std::vector<HashItem>& items,
const AABBs& boxes,
const std::function<bool(size_t, size_t)>& can_collide,
std::vector<Candidate>& candidates) const;¶ Find the candidate collisions among a set of items.
Spatial Hash¶
- class SpatialHash : public ipc::BroadPhase;¶
Inheritance diagram for ipc::SpatialHash:
Collaboration diagram for ipc::SpatialHash:
Spatial hash broad phase collision detection.
Public Functions¶
- SpatialHash();¶
- ~SpatialHash();¶
- inline virtual std::string name() const override;¶
Get the name of the broad phase method.
- Returns:¶
The name of the broad phase method.
-
inline virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0) override;¶ Build the spatial hash for static collision detection.
-
inline virtual void build(
Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0) override;¶ Build the spatial hash for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- const double inflation_radius = 0¶
Radius of inflation around all elements.
-
inline virtual void build(const AABBs& _vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const uint8_t _dim) override;¶ Build the spatial hash from vertex boxes.
-
void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, double inflation_radius,
double voxel_size);¶ Build the spatial hash for static collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices¶
Vertex positions
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- double inflation_radius¶
Radius of inflation around all elements.
- double voxel_size¶
Size of the voxels used in the spatial hash.
-
void build(Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, double inflation_radius,
double voxel_size);¶ Build the spatial hash for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- double inflation_radius¶
Radius of inflation around all elements.
- double voxel_size¶
Size of the voxels used in the spatial hash.
-
void build(const AABBs& vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, const uint8_t dim,
double voxel_size);¶ Build the spatial hash for static collision detection.
Build the spatial hash from vertex boxes.
- virtual void clear() override;¶
Clear any built data.
-
virtual void detect_vertex_vertex_candidates(
std::vector<VertexVertexCandidate>& candidates) const override;¶ Find the candidate vertex-vertex collisions.
- Parameters:¶
- std::vector<VertexVertexCandidate> &candidates¶
[out] The candidate vertex-vertex collisions.
-
virtual void detect_edge_vertex_candidates(
std::vector<EdgeVertexCandidate>& candidates) const override;¶ Find the candidate edge-vertex collisions.
- Parameters:¶
- std::vector<EdgeVertexCandidate> &candidates¶
[out] The candidate edge-vertex collisions.
-
virtual void detect_edge_edge_candidates(
std::vector<EdgeEdgeCandidate>& candidates) const override;¶ Find the candidate edge-edge collisions.
- Parameters:¶
- std::vector<EdgeEdgeCandidate> &candidates¶
[out] The candidate edge-edge collisions.
-
virtual void detect_face_vertex_candidates(
std::vector<FaceVertexCandidate>& candidates) const override;¶ Find the candidate face-vertex collisions.
- Parameters:¶
- std::vector<FaceVertexCandidate> &candidates¶
[out] The candidate face-vertex collisions.
-
virtual void detect_edge_face_candidates(
std::vector<EdgeFaceCandidate>& candidates) const override;¶ Find the candidate edge-face intersections.
- Parameters:¶
- std::vector<EdgeFaceCandidate> &candidates¶
[out] The candidate edge-face intersections.
-
virtual void detect_face_face_candidates(
std::vector<FaceFaceCandidate>& candidates) const override;¶ Find the candidate face-face collisions.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0); Build the broad phase for static collision detection.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0); Build the broad phase for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- const double inflation_radius = 0¶
Radius of inflation around all elements.
-
virtual void build(const AABBs& vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, const uint8_t dim); Build the broad phase for collision detection.
Private Functions¶
-
void build(Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, double voxel_size);¶
-
void locate_box_voxel_axis_index(Eigen::Array3d min_corner,
Eigen::Array3d max_corner, Eigen::Ref<Eigen::Array3i> min_index,
Eigen::Ref<Eigen::Array3i> max_index,
const double inflation_radius = 0) const;¶
-
int voxel_axis_index_to_voxel_index(
Eigen::ConstRef<Eigen::Array3i> voxel_axis_index) const;¶
Private Members¶
- Eigen::Array3d left_bottom_corner;¶
The left bottom corner of the world bounding box.
- Eigen::Array3d right_top_corner;¶
The right top corner of the world bounding box.
- Eigen::Array3i voxel_count;¶
The number of voxels in each dimension.
- double one_div_voxel_size = -1;¶
1.0 / voxel_size
- int voxel_count_0x1 = -1;¶
The number of voxels in the first two dimensions.
- struct Impl;¶
-
Public Members¶
- unordered_map<int, std::vector<int>> voxel_to_primitives;¶
Map from voxel index to the primitive indices it contains.
- std::vector<std::vector<int>> point_to_voxels;¶
Map from point index to the voxel indices it occupies.
- std::vector<std::vector<int>> edge_to_voxels;¶
Map from edge index to the voxel indices it occupies.
- std::vector<std::vector<int>> face_to_voxels;¶
Map from face index to the voxel indices it occupies.
- int edge_start_ind = -1;¶
The index of the first edge in voxel_occupancies.
- int tri_start_ind = -1;¶
The index of the first triangle in voxel_occupancies.
BVH¶
- class BVH : public ipc::BroadPhase;¶
Inheritance diagram for ipc::BVH:
Collaboration diagram for ipc::BVH:
Bounding Volume Hierarchy (BVH) broad phase collision detection.
Public Functions¶
- BVH();¶
- ~BVH();¶
- inline virtual std::string name() const override;¶
Get the name of the broad phase method.
- Returns:¶
The name of the broad phase method.
- virtual void clear() override;¶
Clear any built data.
-
virtual void detect_vertex_vertex_candidates(
std::vector<VertexVertexCandidate>& candidates) const override;¶ Find the candidate vertex-vertex collisions.
- Parameters:¶
- std::vector<VertexVertexCandidate> &candidates¶
[out] The candidate vertex-vertex collisions.
-
virtual void detect_edge_vertex_candidates(
std::vector<EdgeVertexCandidate>& candidates) const override;¶ Find the candidate edge-vertex collisions.
- Parameters:¶
- std::vector<EdgeVertexCandidate> &candidates¶
[out] The candidate edge-vertex collisions.
-
virtual void detect_edge_edge_candidates(
std::vector<EdgeEdgeCandidate>& candidates) const override;¶ Find the candidate edge-edge collisions.
- Parameters:¶
- std::vector<EdgeEdgeCandidate> &candidates¶
[out] The candidate edge-edge collisions.
-
virtual void detect_face_vertex_candidates(
std::vector<FaceVertexCandidate>& candidates) const override;¶ Find the candidate face-vertex collisions.
- Parameters:¶
- std::vector<FaceVertexCandidate> &candidates¶
[out] The candidate face-vertex collisions.
-
virtual void detect_edge_face_candidates(
std::vector<EdgeFaceCandidate>& candidates) const override;¶ Find the candidate edge-face intersections.
- Parameters:¶
- std::vector<EdgeFaceCandidate> &candidates¶
[out] The candidate edge-face intersections.
-
virtual void detect_face_face_candidates(
std::vector<FaceFaceCandidate>& candidates) const override;¶ Find the candidate face-face collisions.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for static collision detection.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- const double inflation_radius = 0¶
Radius of inflation around all elements.
-
virtual void build(const AABBs& vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, const uint8_t dim);¶ Build the broad phase for collision detection.
Protected Functions¶
Protected Attributes¶
Protected Static Functions¶
- static void init_bvh(const AABBs& boxes, SimpleBVH::BVH& bvh);¶
Initialize a BVH from a set of boxes.
-
template <typename Candidate, bool swap_order = false,
bool triangular = false>
static void detect_candidates(const AABBs& boxes,
const SimpleBVH::BVH& bvh,
const std::function<bool(size_t, size_t)>& can_collide,
std::vector<Candidate>& candidates);¶ Detect candidate collisions between a BVH and a sets of boxes.
- Template Parameters:¶
- Parameters:¶
- const AABBs &boxes¶
[in] The boxes to detect collisions with.
- const SimpleBVH::BVH &bvh¶
[in] The BVH to detect collisions with.
- const std::function<bool(size_t, size_t)> &can_collide¶
[in] Function to determine if two primitives can collide given their ids.
- std::vector<Candidate> &candidates¶
[out] The candidate collisions.
LBVH —
- class LBVH : public ipc::BroadPhase;¶
Inheritance diagram for ipc::LBVH:
Collaboration diagram for ipc::LBVH:
Linear Bounding Volume Hierarchy (LBVH) broad phase collision detection.
Public Types¶
-
using MortonCodeElements = std::vector<MortonCodeElement,
DefaultInitAllocator<MortonCodeElement>>;¶
Public Functions¶
- LBVH();¶
- ~LBVH();¶
- inline virtual std::string name() const override;¶
Get the name of the broad phase method.
- Returns:¶
The name of the broad phase method.
- virtual void clear() override;¶
Clear any built data.
-
virtual void detect_vertex_vertex_candidates(
std::vector<VertexVertexCandidate>& candidates) const override;¶ Find the candidate vertex-vertex collisions.
- Parameters:¶
- std::vector<VertexVertexCandidate> &candidates¶
[out] The candidate vertex-vertex collisions.
-
virtual void detect_edge_vertex_candidates(
std::vector<EdgeVertexCandidate>& candidates) const override;¶ Find the candidate edge-vertex collisions.
- Parameters:¶
- std::vector<EdgeVertexCandidate> &candidates¶
[out] The candidate edge-vertex collisions.
-
virtual void detect_edge_edge_candidates(
std::vector<EdgeEdgeCandidate>& candidates) const override;¶ Find the candidate edge-edge collisions.
- Parameters:¶
- std::vector<EdgeEdgeCandidate> &candidates¶
[out] The candidate edge-edge collisions.
-
virtual void detect_face_vertex_candidates(
std::vector<FaceVertexCandidate>& candidates) const override;¶ Find the candidate face-vertex collisions.
- Parameters:¶
- std::vector<FaceVertexCandidate> &candidates¶
[out] The candidate face-vertex collisions.
-
virtual void detect_edge_face_candidates(
std::vector<EdgeFaceCandidate>& candidates) const override;¶ Find the candidate edge-face intersections.
- Parameters:¶
- std::vector<EdgeFaceCandidate> &candidates¶
[out] The candidate edge-face intersections.
-
virtual void detect_face_face_candidates(
std::vector<FaceFaceCandidate>& candidates) const override;¶ Find the candidate face-face collisions.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for static collision detection.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- const double inflation_radius = 0¶
Radius of inflation around all elements.
-
virtual void build(const AABBs& vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, const uint8_t dim);¶ Build the broad phase for collision detection.
Protected Functions¶
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces) override; Build the broad phase for collision detection.
Note
Assumes the vertex_boxes have been built.
- inline bool has_vertices() const;¶
- inline bool has_edges() const;¶
- inline bool has_faces() const;¶
Protected Attributes¶
Protected Static Functions¶
-
template <typename Candidate, bool swap_order = false,
bool triangular = false>
static void detect_candidates(const Nodes& source,
const Nodes& target,
const std::function<bool(size_t, size_t)>& can_collide,
std::vector<Candidate>& candidates);¶ Detect candidate collisions between a LBVH and a sets of boxes.
-
template <typename Candidate>
static inline void detect_candidates(const Nodes& source_and_target,
const std::function<bool(size_t, size_t)>& can_collide,
std::vector<Candidate>& candidates);¶
Private Types¶
-
using ConstructionInfos = std::vector<ConstructionInfo,
DefaultInitAllocator<ConstructionInfo>>;¶
-
using EdgeIndices = std::vector<std::array<index_t, 2>,
DefaultInitAllocator<std::array<index_t, 2>>>;¶
-
using FaceIndices = std::vector<std::array<index_t, 3>,
DefaultInitAllocator<std::array<index_t, 3>>>;¶
Private Members¶
- EdgeIndices edge_vertex_ids;¶
Edge vertices in the original mesh order.
- FaceIndices face_vertex_ids;¶
Face vertices in the original mesh order.
- struct ConstructionInfo;¶
- struct MortonCodeElement;¶
- struct Node;¶
Public Functions¶
- inline bool is_inner() const;¶
Check if this node is an inner node.
- inline bool is_leaf() const;¶
Check if this node is a leaf node.
- inline bool is_valid() const;¶
Check if this node is valid.
Public Members¶
- int32_t left;¶
Pointer to the left child or INVALID_POINTER in case of leaf.
- int32_t right;¶
Pointer to the right child or INVALID_POINTER in case of leaf.
- int32_t primitive_id;¶
The primitive id (INVALID_ID <=> inner node)
Note
We use this to distinguish leaves from internal nodes to safely access the union.
- int32_t is_inner_marker;¶
Marker to indicate this is an inner node If is_inner == 0 then right = 0 which is INVALID_POINTER If is_inner != 0 then right = actual right pointer.
- union ipc::LBVH::Node;
-
using MortonCodeElements = std::vector<MortonCodeElement,
Sweep and Prune¶
- class SweepAndPrune : public ipc::BroadPhase;¶
Inheritance diagram for ipc::SweepAndPrune:
Collaboration diagram for ipc::SweepAndPrune:
Sweep and Prune broad phase collision detection.
Public Functions¶
- SweepAndPrune();¶
- ~SweepAndPrune();¶
- inline virtual std::string name() const override;¶
Get the name of the broad phase method.
- Returns:¶
The name of the broad phase method.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
double inflation_radius = 0) override;¶ Build the broad phase for static collision detection.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
double inflation_radius = 0) override;¶ Build the broad phase for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertex positions
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertex positions
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- double inflation_radius = 0¶
Radius of inflation around all elements.
-
virtual void build(const AABBs& vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const uint8_t dim) override;¶ Build the broad phase from precomputed AABBs.
- virtual void clear() override;¶
Clear any built data.
-
virtual void detect_vertex_vertex_candidates(
std::vector<VertexVertexCandidate>& candidates) const override;¶ Find the candidate vertex-vertex collisions.
- Parameters:¶
- std::vector<VertexVertexCandidate> &candidates¶
[out] The candidate vertex-vertex collisions.
-
virtual void detect_edge_vertex_candidates(
std::vector<EdgeVertexCandidate>& candidates) const override;¶ Find the candidate edge-vertex collisions.
- Parameters:¶
- std::vector<EdgeVertexCandidate> &candidates¶
[out] The candidate edge-vertex collisions.
-
virtual void detect_edge_edge_candidates(
std::vector<EdgeEdgeCandidate>& candidates) const override;¶ Find the candidate edge-edge collisions.
- Parameters:¶
- std::vector<EdgeEdgeCandidate> &candidates¶
[out] The candidate edge-edge collisions.
-
virtual void detect_face_vertex_candidates(
std::vector<FaceVertexCandidate>& candidates) const override;¶ Find the candidate face-vertex collisions.
- Parameters:¶
- std::vector<FaceVertexCandidate> &candidates¶
[out] The candidate face-vertex collisions.
-
virtual void detect_edge_face_candidates(
std::vector<EdgeFaceCandidate>& candidates) const override;¶ Find the candidate edge-face intersections.
- Parameters:¶
- std::vector<EdgeFaceCandidate> &candidates¶
[out] The candidate edge-face intersections.
-
virtual void detect_face_face_candidates(
std::vector<FaceFaceCandidate>& candidates) const override;¶ Find the candidate face-face collisions.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for static collision detection.
-
virtual void build(Eigen::ConstRef<Eigen::MatrixXd> vertices_t0,
Eigen::ConstRef<Eigen::MatrixXd> vertices_t1,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces,
const double inflation_radius = 0);¶ Build the broad phase for continuous collision detection.
- Parameters:¶
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t0¶
Starting vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXd> vertices_t1¶
Ending vertices of the vertices.
- Eigen::ConstRef<Eigen::MatrixXi> edges¶
Collision mesh edges
- Eigen::ConstRef<Eigen::MatrixXi> faces¶
Collision mesh faces
- const double inflation_radius = 0¶
Radius of inflation around all elements.
-
virtual void build(const AABBs& vertex_boxes,
Eigen::ConstRef<Eigen::MatrixXi> edges,
Eigen::ConstRef<Eigen::MatrixXi> faces, const uint8_t dim); Build the broad phase for collision detection.
Protected Functions¶
Protected Attributes¶
- mutable int vv_sort_axis = 0;¶
- mutable int ev_sort_axis = 0;¶
- mutable int ee_sort_axis = 0;¶
- mutable int fv_sort_axis = 0;¶
- mutable int ef_sort_axis = 0;¶
- mutable int ff_sort_axis = 0;¶
- struct Boxes;¶
Sweep and Tiniest Queue¶
AABB¶
- class AABB;¶
Axis aligned bounding-box of some type.
Public Functions¶
- AABB() = default;¶
-
AABB(Eigen::ConstRef<ArrayMax3d> min,
Eigen::ConstRef<ArrayMax3d> max);¶
Public Members¶
Public Static Functions¶
-
static AABB from_point(Eigen::ConstRef<VectorMax3d> p,
const double inflation_radius = 0);¶ Construct an AABB for a static point.
-
static inline AABB from_point(Eigen::ConstRef<VectorMax3d> p_t0,
Eigen::ConstRef<VectorMax3d> p_t1,
const double inflation_radius = 0);¶ Construct an AABB for a moving point (i.e.
temporal edge).
- Parameters:¶
- Eigen::ConstRef<VectorMax3d> p_t0¶
The point’s position at time t=0.
- Eigen::ConstRef<VectorMax3d> p_t1¶
The point’s position at time t=1.
- const double inflation_radius = 0¶
Radius of a capsule around the temporal edge which the AABB encloses.
- Returns:¶
The constructed AABB.
-
static void conservative_inflation(Eigen::Ref<ArrayMax3d> min,
Eigen::Ref<ArrayMax3d> max, const double inflation_radius);¶ Compute a conservative inflation of the AABB.