39 #ifndef COAL_BVH_MODEL_H
40 #define COAL_BVH_MODEL_H
56 template <
typename _IndexType>
59 template <
typename BV>
61 template <
typename BV>
95 if (num_tris && num_vertices)
97 else if (num_vertices)
119 int beginModel(
unsigned int num_tris = 0,
unsigned int num_vertices = 0);
135 const std::vector<Triangle32>& ts);
198 virtual int memUsage(
const bool msg =
false)
const = 0;
209 if (!(vertices.get())) {
210 std::cerr <<
"BVH Error in `computeCOM`! The BVHModel does not contain "
215 const std::vector<Vec3s>& vertices_ = *vertices;
216 if (!(tri_indices.get())) {
217 std::cerr <<
"BVH Error in `computeCOM`! The BVHModel does not contain "
222 const std::vector<Triangle32>& tri_indices_ = *tri_indices;
224 for (
unsigned int i = 0; i < num_tris; ++i) {
227 (vertices_[tri[0]].cross(vertices_[tri[1]])).dot(vertices_[tri[2]]);
229 com += (vertices_[tri[0]] + vertices_[tri[1]] + vertices_[tri[2]]) *
233 return com / (vol * 4);
238 if (!(vertices.get())) {
239 std::cerr <<
"BVH Error in `computeCOM`! The BVHModel does not contain "
244 const std::vector<Vec3s>& vertices_ = *vertices;
245 if (!(tri_indices.get())) {
246 std::cerr <<
"BVH Error in `computeCOM`! The BVHModel does not contain "
251 const std::vector<Triangle32>& tri_indices_ = *tri_indices;
252 for (
unsigned int i = 0; i < num_tris; ++i) {
255 (vertices_[tri[0]].cross(vertices_[tri[1]])).dot(vertices_[tri[2]]);
266 C_canonical <<
Scalar(1 / 60.0),
276 if (!(vertices.get())) {
277 std::cerr <<
"BVH Error in `computeMomentofInertia`! The BVHModel does "
278 "not contain vertices."
282 const std::vector<Vec3s>& vertices_ = *vertices;
283 if (!(vertices.get())) {
284 std::cerr <<
"BVH Error in `computeMomentofInertia`! The BVHModel does "
285 "not contain vertices."
289 const std::vector<Triangle32>& tri_indices_ = *tri_indices;
290 for (
unsigned int i = 0; i < num_tris; ++i) {
292 const Vec3s& v1 = vertices_[tri[0]];
293 const Vec3s& v2 = vertices_[tri[1]];
294 const Vec3s& v3 = vertices_[tri[2]];
296 A << v1.transpose(), v2.transpose(), v3.transpose();
297 C += A.derived().transpose() * C_canonical * A * (v1.cross(v2)).dot(v3);
300 return C.trace() * Matrix3s::Identity() - C;
325 template <
typename BV>
331 std::vector<BVNode<BV>, Eigen::aligned_allocator<BVNode<BV>>>;
384 makeParentRelativeRecurse(0, I, Vec3s::Zero());
395 std::shared_ptr<bv_node_vector_t>
bvs;
416 unsigned int num_primitives);
425 const Vec3s& parent_c) {
427 if (!bvs_[
static_cast<size_t>(bv_id)].isLeaf()) {
428 makeParentRelativeRecurse(bvs_[
static_cast<size_t>(bv_id)].first_child,
430 bvs_[
static_cast<size_t>(bv_id)].getCenter());
432 makeParentRelativeRecurse(
433 bvs_[
static_cast<size_t>(bv_id)].first_child + 1, parent_axes,
434 bvs_[
static_cast<size_t>(bv_id)].getCenter());
437 bvs_[
static_cast<size_t>(bv_id)].bv =
438 translate(bvs_[
static_cast<size_t>(bv_id)].bv, -parent_c);
444 if (other_ptr ==
nullptr)
return false;
448 if (!res)
return false;
493 if (num_bvs != other.
num_bvs)
return false;
495 if ((!(bvs.get()) && other.
bvs.get()) || (bvs.get() && !(other.
bvs.get())))
497 if (bvs.get() && other.
bvs.get()) {
498 const bv_node_vector_t& bvs_ = *bvs;
499 const bv_node_vector_t& other_bvs_ = *(other.
bvs);
500 for (
unsigned int k = 0; k < num_bvs; ++k) {
501 if (bvs_[k] != other_bvs_[k])
return false;
513 const Vec3s& parent_c);
517 const Vec3s& parent_c);
522 const Vec3s& parent_c);
A base class describing the bounding hierarchy of a mesh model or a point cloud model (which is viewe...
Definition: BVH_model.h:66
virtual void deleteBVs()=0
int endUpdateModel(bool refit=true, bool bottomup=true)
End BVH model update, will also refit or rebuild the bounding volume hierarchy.
ConvexBaseTpl< IndexType > ConvexType
Definition: BVH_model.h:69
OBJECT_TYPE getObjectType() const
Get the object type: it is a BVH.
Definition: BVH_model.h:113
shared_ptr< ConvexType > convex
Convex<Triangle> representation of this object.
Definition: BVH_model.h:91
unsigned int num_vertices
Number of points.
Definition: BVH_model.h:84
virtual int refitTree(bool bottomup)=0
Refit the bounding volume hierarchy.
void computeLocalAABB()
Compute the AABB for the BVH, used for broad-phase collision.
int replaceTriangle(const Vec3s &p1, const Vec3s &p2, const Vec3s &p3)
Replace one triangle in the old BVH model.
Triangle32::IndexType IndexType
Definition: BVH_model.h:68
virtual ~BVHModelBase()
deconstruction, delete mesh data related.
Definition: BVH_model.h:110
Scalar computeVolume() const
compute the volume
Definition: BVH_model.h:236
int addSubModel(const std::vector< Vec3s > &ps, const std::vector< Triangle32 > &ts)
Add a set of triangles in the new BVH model.
int updateSubModel(const std::vector< Vec3s > &ps)
Update a set of points in the old BVH model.
BVHModelBase(const BVHModelBase &other)
copy from another BVH
virtual int memUsage(const bool msg=false) const =0
std::shared_ptr< std::vector< Vec3s > > prev_vertices
Geometry point data in previous frame.
Definition: BVH_model.h:78
int addSubModel(const std::vector< Vec3s > &ps)
Add a set of points in the new BVH model.
int beginModel(unsigned int num_tris=0, unsigned int num_vertices=0)
Begin a new BVH model.
unsigned int num_tris_allocated
Definition: BVH_model.h:313
int endModel()
End BVH model construction, will build the bounding volume hierarchy.
Matrix3s computeMomentofInertia() const
compute the inertia matrix, related to the origin
Definition: BVH_model.h:262
int replaceVertex(const Vec3s &p)
Replace one point in the old BVH model.
int updateTriangle(const Vec3s &p1, const Vec3s &p2, const Vec3s &p3)
Update one triangle in the old BVH model.
virtual bool allocateBVs()=0
int beginReplaceModel()
Replace the geometry information of current frame (i.e. should have the same mesh topology with the p...
int addTriangle(const Vec3s &p1, const Vec3s &p2, const Vec3s &p3)
Add one triangle in the new BVH model.
BVHBuildState build_state
The state of BVH building process.
Definition: BVH_model.h:87
virtual void makeParentRelative()=0
This is a special acceleration: BVH_model default stores the BV's transform in world coordinate....
int addTriangles(const Matrixx3i &triangles)
Add triangles in the new BVH model.
void buildConvexRepresentation(bool share_memory)
Build this Convex<Triangle> representation of this model. The result is stored in attribute convex.
virtual bool isEqual(const CollisionGeometry &other) const
for ccd vertex update
bool buildConvexHull(bool keepTriangle, const char *qhullCommand=NULL)
Build a convex hull and store it in attribute convex.
virtual int buildTree()=0
Build the bounding volume hierarchy.
int addVertex(const Vec3s &p)
Add one point in the new BVH model.
int beginUpdateModel()
Replace the geometry information of current frame (i.e. should have the same mesh topology with the p...
unsigned int num_tris
Number of triangles.
Definition: BVH_model.h:81
BVHModelBase()
Constructing an empty BVH.
int endReplaceModel(bool refit=true, bool bottomup=true)
End BVH model replacement, will also refit or rebuild the bounding volume hierarchy.
std::shared_ptr< std::vector< Triangle32 > > tri_indices
Geometry triangle index data, will be NULL for point clouds.
Definition: BVH_model.h:75
unsigned int num_vertices_allocated
Definition: BVH_model.h:314
BVHModelType getModelType() const
Model type described by the instance.
Definition: BVH_model.h:94
std::shared_ptr< std::vector< Vec3s > > vertices
Geometry point data.
Definition: BVH_model.h:72
int replaceSubModel(const std::vector< Vec3s > &ps)
Replace a set of points in the old BVH model.
Vec3s computeCOM() const
compute center of mass
Definition: BVH_model.h:206
unsigned int num_vertex_updated
Definition: BVH_model.h:315
int addVertices(const MatrixX3s &points)
Add points in the new BVH model.
int updateVertex(const Vec3s &p)
Update one point in the old BVH model.
A class describing the bounding hierarchy of a mesh model or a point cloud model (which is viewed as ...
Definition: BVH_model.h:326
std::shared_ptr< bv_node_vector_t > bvs
Bounding volume hierarchy.
Definition: BVH_model.h:395
unsigned int num_bvs
Number of BV nodes in bounding volume hierarchy.
Definition: BVH_model.h:398
std::shared_ptr< std::vector< unsigned int > > primitive_indices
Definition: BVH_model.h:392
int refitTree_bottomup()
Refit the bounding volume hierarchy in a bottom-up way (fast but less compact)
~BVHModel()
deconstruction, delete mesh data related.
Definition: BVH_model.h:352
std::vector< BVNode< BV >, Eigen::aligned_allocator< BVNode< BV > >> bv_node_vector_t
Definition: BVH_model.h:331
int refitTree(bool bottomup)
Refit the bounding volume hierarchy.
const BVNode< BV > & getBV(unsigned int i) const
We provide getBV() and getNumBVs() because BVH may be compressed (in future), so we must provide some...
Definition: BVH_model.h:358
int refitTree_topdown()
Refit the bounding volume hierarchy in a top-down way (slow but more compact)
void makeParentRelativeRecurse(int bv_id, Matrix3s &parent_axes, const Vec3s &parent_c)
Definition: BVH_model.h:424
BVNode< BV > & getBV(unsigned int i)
Access the bv giving the its index.
Definition: BVH_model.h:364
int memUsage(const bool msg) const
Check the number of memory used.
NODE_TYPE getNodeType() const
Get the BV type: default is unknown.
Definition: BVH_model.h:373
void makeParentRelative()
This is a special acceleration: BVH_model default stores the BV's transform in world coordinate....
Definition: BVH_model.h:382
BVHModel()
Default constructor to build an empty BVH.
shared_ptr< BVSplitter< BV > > bv_splitter
Split rule to split one BV node into two children.
Definition: BVH_model.h:334
virtual BVHModel< BV > * clone() const
Clone *this into a new BVHModel.
Definition: BVH_model.h:349
int recursiveBuildTree(int bv_id, unsigned int first_primitive, unsigned int num_primitives)
Recursive kernel for hierarchy construction.
int buildTree()
Build the bounding volume hierarchy.
int recursiveRefitTree_bottomup(int bv_id)
Recursive kernel for bottomup refitting.
shared_ptr< BVFitter< BV > > bv_fitter
Fitting rule to fit a BV node to a set of geometry primitives.
Definition: BVH_model.h:337
unsigned int num_bvs_allocated
Definition: BVH_model.h:391
unsigned int getNumBVs() const
Get the number of bv in the BVH.
Definition: BVH_model.h:370
BVHModel(const BVHModel &other)
Copy constructor from another BVH.
The geometry for the object for collision or distance computation.
Definition: collision_object.h:96
Triangle with 3 indices for points.
Definition: data_types.h:122
_IndexType IndexType
Definition: data_types.h:127
#define COAL_DLLAPI
Definition: config.hh:88
@ BV_UNKNOWN
Definition: collision_object.h:65
@ OT_BVH
Definition: collision_object.h:54
Main namespace.
Definition: broadphase_bruteforce.h:44
BVHModelType
BVH model type.
Definition: BVH_internal.h:79
@ BVH_MODEL_POINTCLOUD
triangle model
Definition: BVH_internal.h:82
@ BVH_MODEL_TRIANGLES
unknown model type
Definition: BVH_internal.h:81
@ BVH_MODEL_UNKNOWN
Definition: BVH_internal.h:80
BVHBuildState
States for BVH construction empty->begun->processed ->replace_begun->processed -> ....
Definition: BVH_internal.h:49
Eigen::Matrix< Scalar, Eigen::Dynamic, 3, Eigen::RowMajor > MatrixX3s
Definition: data_types.h:75
NODE_TYPE
traversal node type: bounding volume (AABB, OBB, RSS, kIOS, OBBRSS, KDOP16, KDOP18,...
Definition: collision_object.h:64
KDOP< N > translate(const KDOP< N > &bv, const Vec3s &t)
translate the KDOP BV
Eigen::Matrix< Scalar, 3, 1 > Vec3s
Definition: data_types.h:70
double Scalar
Definition: data_types.h:68
Eigen::Matrix< Eigen::DenseIndex, Eigen::Dynamic, 3, Eigen::RowMajor > Matrixx3i
Definition: data_types.h:78
OBJECT_TYPE
object type: BVH (mesh, points), basic geometry, octree
Definition: collision_object.h:52
Eigen::Matrix< Scalar, 3, 3 > Matrix3s
Definition: data_types.h:74
bool isEqual(const Eigen::MatrixBase< Derived > &lhs, const Eigen::MatrixBase< OtherDerived > &rhs, const Scalar tol=std::numeric_limits< Scalar >::epsilon() *100)
Definition: tools.h:204
A class describing a bounding volume node. It includes the tree structure providing in BVNodeBase and...
Definition: BV_node.h:106