38 #ifndef FCL_TRAVERSAL_MESHDISTANCETRAVERSALNODE_INL_H 39 #define FCL_TRAVERSAL_MESHDISTANCETRAVERSALNODE_INL_H 56 MeshDistanceTraversalNodeRSS<double>& node,
58 const Transform3<double>& tf1,
60 const Transform3<double>& tf2,
61 const DistanceRequest<double>& request,
62 DistanceResult<double>& result);
71 MeshDistanceTraversalNodekIOS<double>& node,
73 const Transform3<double>& tf1,
75 const Transform3<double>& tf2,
76 const DistanceRequest<double>& request,
77 DistanceResult<double>& result);
86 MeshDistanceTraversalNodeOBBRSS<double>& node,
88 const Transform3<double>& tf1,
90 const Transform3<double>& tf2,
91 const DistanceRequest<double>& request,
92 DistanceResult<double>& result);
95 template <
typename BV>
100 tri_indices1 =
nullptr;
101 tri_indices2 =
nullptr;
103 rel_err = this->request.rel_err;
104 abs_err = this->request.abs_err;
108 template <
typename BV>
111 if(this->enable_statistics) this->num_leaf_tests++;
113 const BVNode<BV>& node1 = this->model1->getBV(b1);
114 const BVNode<BV>& node2 = this->model2->getBV(b2);
119 const Triangle& tri_id1 = tri_indices1[primitive_id1];
120 const Triangle& tri_id2 = tri_indices2[primitive_id2];
122 const Vector3<S>& t11 = vertices1[tri_id1[0]];
123 const Vector3<S>& t12 = vertices1[tri_id1[1]];
124 const Vector3<S>& t13 = vertices1[tri_id1[2]];
126 const Vector3<S>& t21 = vertices2[tri_id2[0]];
127 const Vector3<S>& t22 = vertices2[tri_id2[1]];
128 const Vector3<S>& t23 = vertices2[tri_id2[2]];
136 if(this->request.enable_nearest_points)
138 this->result->update(d, this->model1, this->model2, primitive_id1, primitive_id2, P1, P2);
142 this->result->update(d, this->model1, this->model2, primitive_id1, primitive_id2);
147 template <
typename BV>
150 if((c >= this->result->min_distance - abs_err) && (c * (1 + rel_err) >= this->result->min_distance))
156 template <
typename BV>
168 using S =
typename BV::S;
173 if(!tf1.matrix().isIdentity())
175 std::vector<Vector3<S>> vertices_transformed1(model1.
num_vertices);
180 vertices_transformed1[i] = new_v;
190 if(!tf2.matrix().isIdentity())
192 std::vector<Vector3<S>> vertices_transformed2(model2.
num_vertices);
197 vertices_transformed2[i] = new_v;
225 template <
typename S>
233 template <
typename S>
251 template <
typename S>
263 template <
typename S>
283 template <
typename S>
292 template <
typename S>
310 template <
typename S>
322 template <
typename S>
342 template <
typename S>
351 template <
typename S>
369 template <
typename S>
381 template <
typename S>
401 template <
typename BV>
417 using S =
typename BV::S;
419 if(enable_statistics) num_leaf_tests++;
427 const Triangle& tri_id1 = tri_indices1[primitive_id1];
428 const Triangle& tri_id2 = tri_indices2[primitive_id2];
430 const Vector3<S>& t11 = vertices1[tri_id1[0]];
431 const Vector3<S>& t12 = vertices1[tri_id1[1]];
432 const Vector3<S>& t13 = vertices1[tri_id1[2]];
434 const Vector3<S>& t21 = vertices2[tri_id2[0]];
435 const Vector3<S>& t22 = vertices2[tri_id2[1]];
436 const Vector3<S>& t23 = vertices2[tri_id2[2]];
446 result.
update(d, model1, model2, primitive_id1, primitive_id2, P1, P2);
448 result.
update(d, model1, model2, primitive_id1, primitive_id2);
452 template <
typename BV>
468 using S =
typename BV::S;
470 if(enable_statistics) num_leaf_tests++;
478 const Triangle& tri_id1 = tri_indices1[primitive_id1];
479 const Triangle& tri_id2 = tri_indices2[primitive_id2];
481 const Vector3<S>& t11 = vertices1[tri_id1[0]];
482 const Vector3<S>& t12 = vertices1[tri_id1[1]];
483 const Vector3<S>& t13 = vertices1[tri_id1[2]];
485 const Vector3<S>& t21 = vertices2[tri_id2[0]];
486 const Vector3<S>& t22 = vertices2[tri_id2[1]];
487 const Vector3<S>& t23 = vertices2[tri_id2[2]];
493 t11, t12, t13, t21, t22, t23, tf, P1, P2);
496 result.
update(d, model1, model2, primitive_id1, primitive_id2, P1, P2);
498 result.
update(d, model1, model2, primitive_id1, primitive_id2);
502 template <
typename BV>
517 using S =
typename BV::S;
519 const Triangle& init_tri1 = tri_indices1[init_tri_id1];
520 const Triangle& init_tri2 = tri_indices2[init_tri_id2];
525 init_tri1_points[0] = vertices1[init_tri1[0]];
526 init_tri1_points[1] = vertices1[init_tri1[1]];
527 init_tri1_points[2] = vertices1[init_tri1[2]];
529 init_tri2_points[0] = vertices2[init_tri2[0]];
530 init_tri2_points[1] = vertices2[init_tri2[1]];
531 init_tri2_points[2] = vertices2[init_tri2[2]];
535 init_tri2_points[0], init_tri2_points[1], init_tri2_points[2],
539 result.
update(distance, model1, model2, init_tri_id1, init_tri_id2, p1, p2);
541 result.
update(distance, model1, model2, init_tri_id1, init_tri_id2);
545 template <
typename BV>
559 using S =
typename BV::S;
561 const Triangle& init_tri1 = tri_indices1[init_tri_id1];
562 const Triangle& init_tri2 = tri_indices2[init_tri_id2];
567 init_tri1_points[0] = vertices1[init_tri1[0]];
568 init_tri1_points[1] = vertices1[init_tri1[1]];
569 init_tri1_points[2] = vertices1[init_tri1[2]];
571 init_tri2_points[0] = vertices2[init_tri2[0]];
572 init_tri2_points[1] = vertices2[init_tri2[1]];
573 init_tri2_points[2] = vertices2[init_tri2[2]];
578 init_tri1_points[0], init_tri1_points[1], init_tri1_points[2],
579 init_tri2_points[0], init_tri2_points[1], init_tri2_points[2],
583 result.
update(distance, model1, model2, init_tri_id1, init_tri_id2, p1, p2);
585 result.
update(distance, model1, model2, init_tri_id1, init_tri_id2);
589 template <
typename BV>
605 template <
typename BV,
typename OrientedNode>
630 node.tf = tf1.inverse(Eigen::Isometry) *
tf2;
636 template <
typename S>
651 template <
typename S>
666 template <
typename S>
const BVHModel< BV > * model1
The first BVH model.
int replaceSubModel(const std::vector< Vector3< S >> &ps)
Replace a set of points in the old BVH model.
template class FCL_EXPORT MeshDistanceTraversalNodekIOS< double >
template class FCL_EXPORT MeshDistanceTraversalNodeOBBRSS< double >
template class FCL_EXPORT RSS< double >
Eigen::Transform< S, 3, Eigen::Isometry > Transform3
BVHModelType getModelType() const
Model type described by the instance.
int beginReplaceModel()
Replace the geometry information of current frame (i.e. should have the same mesh topology with the p...
bool initialize(MeshDistanceTraversalNodeOBBRSS< S > &node, const BVHModel< OBBRSS< S >> &model1, const Transform3< S > &tf1, const BVHModel< OBBRSS< S >> &model2, const Transform3< S > &tf2, const DistanceRequest< S > &request, DistanceResult< S > &result)
Initialize traversal node for distance computation between two meshes, specialized for OBBRSS type...
MeshDistanceTraversalNodekIOS()
void leafTesting(int b1, int b2) const
Leaf test between node b1 and b2, if they are both leafs.
Transform3< BV::S > tf2
configuration of second object
static bool setupMeshDistanceOrientedNode(OrientedNode &node, const BVHModel< BV > &model1, const Transform3< typename BV::S > &tf1, const BVHModel< BV > &model2, const Transform3< typename BV::S > &tf2, const DistanceRequest< typename BV::S > &request, DistanceResult< typename BV::S > &result)
Eigen::Matrix< S, 3, 3 > Matrix3
int primitiveId() const
Return the primitive index. The index is referred to the original data (i.e. vertices or tri_indices)...
MeshDistanceTraversalNode()
const CollisionGeometry< S > * o2
collision object 2
Vector3< S > * vertices
Geometry point data.
Eigen::Matrix< S, 3, 1 > Vector3
int num_vertices
Number of points.
Traversal node for distance computation between BVH models.
Triangle * tri_indices
Geometry triangle index data, will be nullptr for point clouds.
Triangle with 3 indices for points.
void distancePreprocessOrientedNode(const BVHModel< BV > *model1, const BVHModel< BV > *model2, const Vector3< typename BV::S > *vertices1, Vector3< typename BV::S > *vertices2, Triangle *tri_indices1, Triangle *tri_indices2, int init_tri_id1, int init_tri_id2, const Matrix3< typename BV::S > &R, const Vector3< typename BV::S > &T, const DistanceRequest< typename BV::S > &request, DistanceResult< typename BV::S > &result)
void meshDistanceOrientedNodeLeafTesting(int b1, int b2, const BVHModel< BV > *model1, const BVHModel< BV > *model2, Vector3< typename BV::S > *vertices1, Vector3< typename BV::S > *vertices2, Triangle *tri_indices1, Triangle *tri_indices2, const Matrix3< typename BV::S > &R, const Vector3< typename BV::S > &T, bool enable_statistics, int &num_leaf_tests, const DistanceRequest< typename BV::S > &request, DistanceResult< typename BV::S > &result)
bool enable_nearest_points
whether to return the nearest points
template bool initialize(MeshCollisionTraversalNodeOBB< double > &node, const BVHModel< OBB< double >> &model1, const Transform3< double > &tf1, const BVHModel< OBB< double >> &model2, const Transform3< double > &tf2, const CollisionRequest< double > &request, CollisionResult< double > &result)
DistanceRequest< BV::S > request
request setting for distance
template void distance(DistanceTraversalNodeBase< double > *node, BVHFrontList *front_list, int qsize)
const CollisionGeometry< S > * o1
collision object 1
template class FCL_EXPORT kIOS< double >
A class describing the bounding hierarchy of a mesh model or a point cloud model (which is viewed as ...
const BVHModel< BV > * model2
The second BVH model.
const BVNode< BV > & getBV(int id) const
We provide getBV() and getNumBVs() because BVH may be compressed (in future), so we must provide some...
DistanceResult< BV::S > * result
distance result kept during the traversal iteration
A class describing a bounding volume node. It includes the tree structure providing in BVNodeBase and...
Triangle distance functions.
Transform3< BV::S > tf1
configuation of first object
void update(S distance, const CollisionGeometry< S > *o1_, const CollisionGeometry< S > *o2_, int b1_, int b2_)
add distance information into the result
template class FCL_EXPORT MeshDistanceTraversalNodeRSS< double >
template class FCL_EXPORT OBBRSS< double >
Vector3< S > nearest_points[2]
Nearest points in the world coordinates.
void distancePostprocessOrientedNode(const BVHModel< BV > *model1, const BVHModel< BV > *model2, const Transform3< typename BV::S > &tf1, const DistanceRequest< typename BV::S > &request, DistanceResult< typename BV::S > &result)
request to the distance computation
int endReplaceModel(bool refit=true, bool bottomup=true)
End BVH model replacement, will also refit or rebuild the bounding volume hierarchy.
bool enable_statistics
Whether stores statistics.
A class describing the kIOS collision structure, which is a set of spheres.
Traversal node for distance computation between two meshes.
static S triDistance(const Vector3< S > T1[3], const Vector3< S > T2[3], Vector3< S > &P, Vector3< S > &Q)
Compute the closest points on two triangles given their absolute coordinate, and returns the distance...