38 #ifndef HPP_FCL_TRAVERSAL_NODE_SETUP_H
39 #define HPP_FCL_TRAVERSAL_NODE_SETUP_H
52 #ifdef HPP_FCL_HAS_OCTOMAP
61 #ifdef HPP_FCL_HAS_OCTOMAP
64 inline bool initialize(OcTreeCollisionTraversalNode& node,
const OcTree& model1,
65 const Transform3f& tf1,
const OcTree& model2,
66 const Transform3f& tf2,
const OcTreeSolver* otsolver,
67 CollisionResult& result) {
68 node.result = &result;
70 node.model1 = &model1;
71 node.model2 = &model2;
73 node.otsolver = otsolver;
83 inline bool initialize(OcTreeDistanceTraversalNode& node,
const OcTree& model1,
84 const Transform3f& tf1,
const OcTree& model2,
85 const Transform3f& tf2,
const OcTreeSolver* otsolver,
86 const DistanceRequest& request, DistanceResult& result)
89 node.request = request;
90 node.result = &result;
92 node.model1 = &model1;
93 node.model2 = &model2;
95 node.otsolver = otsolver;
105 template <
typename S>
106 bool initialize(ShapeOcTreeCollisionTraversalNode<S>& node,
const S& model1,
107 const Transform3f& tf1,
const OcTree& model2,
108 const Transform3f& tf2,
const OcTreeSolver* otsolver,
109 CollisionResult& result) {
110 node.result = &result;
112 node.model1 = &model1;
113 node.model2 = &model2;
115 node.otsolver = otsolver;
125 template <
typename S>
126 bool initialize(OcTreeShapeCollisionTraversalNode<S>& node,
127 const OcTree& model1,
const Transform3f& tf1,
const S& model2,
128 const Transform3f& tf2,
const OcTreeSolver* otsolver,
129 CollisionResult& result) {
130 node.result = &result;
132 node.model1 = &model1;
133 node.model2 = &model2;
135 node.otsolver = otsolver;
145 template <
typename S>
146 bool initialize(ShapeOcTreeDistanceTraversalNode<S>& node,
const S& model1,
147 const Transform3f& tf1,
const OcTree& model2,
148 const Transform3f& tf2,
const OcTreeSolver* otsolver,
149 const DistanceRequest& request, DistanceResult& result) {
150 node.request = request;
151 node.result = &result;
153 node.model1 = &model1;
154 node.model2 = &model2;
156 node.otsolver = otsolver;
166 template <
typename S>
167 bool initialize(OcTreeShapeDistanceTraversalNode<S>& node,
const OcTree& model1,
168 const Transform3f& tf1,
const S& model2,
const Transform3f& tf2,
169 const OcTreeSolver* otsolver,
const DistanceRequest& request,
170 DistanceResult& result) {
171 node.request = request;
172 node.result = &result;
174 node.model1 = &model1;
175 node.model2 = &model2;
177 node.otsolver = otsolver;
187 template <
typename BV>
188 bool initialize(MeshOcTreeCollisionTraversalNode<BV>& node,
189 const BVHModel<BV>& model1,
const Transform3f& tf1,
190 const OcTree& model2,
const Transform3f& tf2,
191 const OcTreeSolver* otsolver, CollisionResult& result) {
192 node.result = &result;
194 node.model1 = &model1;
195 node.model2 = &model2;
197 node.otsolver = otsolver;
207 template <
typename BV>
208 bool initialize(OcTreeMeshCollisionTraversalNode<BV>& node,
209 const OcTree& model1,
const Transform3f& tf1,
210 const BVHModel<BV>& model2,
const Transform3f& tf2,
211 const OcTreeSolver* otsolver, CollisionResult& result) {
212 node.result = &result;
214 node.model1 = &model1;
215 node.model2 = &model2;
217 node.otsolver = otsolver;
227 template <
typename BV>
228 bool initialize(OcTreeHeightFieldCollisionTraversalNode<BV>& node,
229 const OcTree& model1,
const Transform3f& tf1,
230 const HeightField<BV>& model2,
const Transform3f& tf2,
231 const OcTreeSolver* otsolver, CollisionResult& result) {
232 node.result = &result;
234 node.model1 = &model1;
235 node.model2 = &model2;
237 node.otsolver = otsolver;
247 template <
typename BV>
248 bool initialize(HeightFieldOcTreeCollisionTraversalNode<BV>& node,
249 const HeightField<BV>& model1,
const Transform3f& tf1,
250 const OcTree& model2,
const Transform3f& tf2,
251 const OcTreeSolver* otsolver, CollisionResult& result) {
252 node.result = &result;
254 node.model1 = &model1;
255 node.model2 = &model2;
257 node.otsolver = otsolver;
267 template <
typename BV>
268 bool initialize(MeshOcTreeDistanceTraversalNode<BV>& node,
269 const BVHModel<BV>& model1,
const Transform3f& tf1,
270 const OcTree& model2,
const Transform3f& tf2,
271 const OcTreeSolver* otsolver,
const DistanceRequest& request,
272 DistanceResult& result) {
273 node.request = request;
274 node.result = &result;
276 node.model1 = &model1;
277 node.model2 = &model2;
279 node.otsolver = otsolver;
289 template <
typename BV>
290 bool initialize(OcTreeMeshDistanceTraversalNode<BV>& node,
const OcTree& model1,
291 const Transform3f& tf1,
const BVHModel<BV>& model2,
292 const Transform3f& tf2,
const OcTreeSolver* otsolver,
293 const DistanceRequest& request, DistanceResult& result) {
294 node.request = request;
295 node.result = &result;
297 node.model1 = &model1;
298 node.model2 = &model2;
300 node.otsolver = otsolver;
312 template <
typename S1,
typename S2>
313 bool initialize(ShapeCollisionTraversalNode<S1, S2>& node,
const S1& shape1,
314 const Transform3f& tf1,
const S2& shape2,
315 const Transform3f& tf2,
const GJKSolver* nsolver,
316 CollisionResult& result) {
317 node.model1 = &shape1;
319 node.model2 = &shape2;
321 node.nsolver = nsolver;
323 node.result = &result;
330 template <
typename BV,
typename S>
331 bool initialize(MeshShapeCollisionTraversalNode<BV, S>& node,
332 BVHModel<BV>& model1, Transform3f& tf1,
const S& model2,
333 const Transform3f& tf2,
const GJKSolver* nsolver,
334 CollisionResult& result,
bool use_refit =
false,
335 bool refit_bottomup =
false) {
338 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
339 std::invalid_argument)
341 if (!tf1.isIdentity() &&
342 model1.vertices.get())
344 std::vector<Vec3f> vertices_transformed(model1.num_vertices);
345 const std::vector<Vec3f>& model1_vertices_ = *(model1.vertices);
346 for (
unsigned int i = 0; i < model1.num_vertices; ++i) {
347 const Vec3f& p = model1_vertices_[i];
348 Vec3f new_v = tf1.transform(p);
349 vertices_transformed[i] = new_v;
352 model1.beginReplaceModel();
353 model1.replaceSubModel(vertices_transformed);
354 model1.endReplaceModel(use_refit, refit_bottomup);
359 node.model1 = &model1;
361 node.model2 = &model2;
363 node.nsolver = nsolver;
367 node.vertices = model1.vertices.get() ? model1.vertices->data() : NULL;
369 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
371 node.result = &result;
378 template <
typename BV,
typename S>
379 bool initialize(MeshShapeCollisionTraversalNode<BV, S, 0>& node,
380 const BVHModel<BV>& model1,
const Transform3f& tf1,
381 const S& model2,
const Transform3f& tf2,
382 const GJKSolver* nsolver, CollisionResult& result) {
385 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
386 std::invalid_argument)
388 node.model1 = &model1;
390 node.model2 = &model2;
392 node.nsolver = nsolver;
396 node.vertices = model1.vertices.get() ? model1.vertices->data() : NULL;
398 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
400 node.result = &result;
407 template <
typename BV,
typename S>
408 bool initialize(HeightFieldShapeCollisionTraversalNode<BV, S>& node,
409 HeightField<BV>& model1, Transform3f& tf1,
const S& model2,
410 const Transform3f& tf2,
const GJKSolver* nsolver,
411 CollisionResult& result,
bool use_refit =
false,
412 bool refit_bottomup =
false);
416 template <
typename BV,
typename S>
417 bool initialize(HeightFieldShapeCollisionTraversalNode<BV, S, 0>& node,
418 const HeightField<BV>& model1,
const Transform3f& tf1,
419 const S& model2,
const Transform3f& tf2,
420 const GJKSolver* nsolver, CollisionResult& result) {
421 node.model1 = &model1;
423 node.model2 = &model2;
425 node.nsolver = nsolver;
429 node.result = &result;
436 template <
typename S,
typename BV,
template <
typename>
class OrientedNode>
437 static inline bool setupShapeMeshCollisionOrientedNode(
438 OrientedNode<S>& node,
const S& model1,
const Transform3f& tf1,
439 const BVHModel<BV>& model2,
const Transform3f& tf2,
440 const GJKSolver* nsolver, CollisionResult& result) {
443 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
444 std::invalid_argument)
446 node.model1 = &model1;
448 node.model2 = &model2;
450 node.nsolver = nsolver;
454 node.vertices = model2.vertices.get() ? model2.vertices->data() : NULL;
456 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
458 node.result = &result;
467 template <
typename BV>
469 MeshCollisionTraversalNode<BV, RelativeTransformationIsIdentity>& node,
470 BVHModel<BV>& model1, Transform3f& tf1, BVHModel<BV>& model2,
471 Transform3f& tf2, CollisionResult& result,
bool use_refit =
false,
472 bool refit_bottomup =
false) {
475 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
476 std::invalid_argument)
479 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
480 std::invalid_argument)
482 if (!tf1.isIdentity() && model1.vertices.get()) {
483 std::vector<Vec3f> vertices_transformed1(model1.num_vertices);
484 const std::vector<Vec3f>& model1_vertices_ = *(model1.vertices);
485 for (
unsigned int i = 0; i < model1.num_vertices; ++i) {
486 const Vec3f& p = model1_vertices_[i];
487 Vec3f new_v = tf1.transform(p);
488 vertices_transformed1[i] = new_v;
491 model1.beginReplaceModel();
492 model1.replaceSubModel(vertices_transformed1);
493 model1.endReplaceModel(use_refit, refit_bottomup);
498 if (!tf2.isIdentity() && model2.vertices.get()) {
499 std::vector<Vec3f> vertices_transformed2(model2.num_vertices);
500 const std::vector<Vec3f>& model2_vertices_ = *(model2.vertices);
501 for (
unsigned int i = 0; i < model2.num_vertices; ++i) {
502 const Vec3f& p = model2_vertices_[i];
503 Vec3f new_v = tf2.transform(p);
504 vertices_transformed2[i] = new_v;
507 model2.beginReplaceModel();
508 model2.replaceSubModel(vertices_transformed2);
509 model2.endReplaceModel(use_refit, refit_bottomup);
514 node.model1 = &model1;
516 node.model2 = &model2;
519 node.vertices1 = model1.vertices.get() ? model1.vertices->data() : NULL;
520 node.vertices2 = model2.vertices.get() ? model2.vertices->data() : NULL;
523 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
525 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
527 node.result = &result;
532 template <
typename BV>
534 const BVHModel<BV>& model1,
const Transform3f& tf1,
535 const BVHModel<BV>& model2,
const Transform3f& tf2,
536 CollisionResult& result) {
539 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
540 std::invalid_argument)
543 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
544 std::invalid_argument)
546 node.vertices1 = model1.vertices ? model1.vertices->data() : NULL;
547 node.vertices2 = model2.vertices ? model2.vertices->data() : NULL;
550 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
552 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
554 node.model1 = &model1;
556 node.model2 = &model2;
559 node.result = &result;
561 node.RT.R.noalias() = tf1.getRotation().transpose() * tf2.getRotation();
562 node.RT.T.noalias() = tf1.getRotation().transpose() *
563 (tf2.getTranslation() - tf1.getTranslation());
569 template <
typename S1,
typename S2>
570 bool initialize(ShapeDistanceTraversalNode<S1, S2>& node,
const S1& shape1,
571 const Transform3f& tf1,
const S2& shape2,
572 const Transform3f& tf2,
const GJKSolver* nsolver,
573 const DistanceRequest& request, DistanceResult& result) {
574 node.request = request;
575 node.result = &result;
577 node.model1 = &shape1;
579 node.model2 = &shape2;
581 node.nsolver = nsolver;
588 template <
typename BV>
590 MeshDistanceTraversalNode<BV, RelativeTransformationIsIdentity>& node,
591 BVHModel<BV>& model1, Transform3f& tf1, BVHModel<BV>& model2,
592 Transform3f& tf2,
const DistanceRequest& request, DistanceResult& result,
593 bool use_refit =
false,
bool refit_bottomup =
false) {
596 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
597 std::invalid_argument)
600 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
601 std::invalid_argument)
603 if (!tf1.isIdentity() && model1.vertices.get()) {
604 std::vector<Vec3f> vertices_transformed1(model1.num_vertices);
605 const std::vector<Vec3f>& model1_vertices_ = *(model1.vertices);
606 for (
unsigned int i = 0; i < model1.num_vertices; ++i) {
607 const Vec3f& p = model1_vertices_[i];
608 Vec3f new_v = tf1.transform(p);
609 vertices_transformed1[i] = new_v;
612 model1.beginReplaceModel();
613 model1.replaceSubModel(vertices_transformed1);
614 model1.endReplaceModel(use_refit, refit_bottomup);
619 if (!tf2.isIdentity() && model2.vertices.get()) {
620 std::vector<Vec3f> vertices_transformed2(model2.num_vertices);
621 const std::vector<Vec3f>& model2_vertices_ = *(model2.vertices);
622 for (
unsigned int i = 0; i < model2.num_vertices; ++i) {
623 const Vec3f& p = model2_vertices_[i];
624 Vec3f new_v = tf2.transform(p);
625 vertices_transformed2[i] = new_v;
628 model2.beginReplaceModel();
629 model2.replaceSubModel(vertices_transformed2);
630 model2.endReplaceModel(use_refit, refit_bottomup);
635 node.request = request;
636 node.result = &result;
638 node.model1 = &model1;
640 node.model2 = &model2;
643 node.vertices1 = model1.vertices.get() ? model1.vertices->data() : NULL;
644 node.vertices2 = model2.vertices.get() ? model2.vertices->data() : NULL;
647 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
649 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
655 template <
typename BV>
657 const BVHModel<BV>& model1,
const Transform3f& tf1,
658 const BVHModel<BV>& model2,
const Transform3f& tf2,
659 const DistanceRequest& request, DistanceResult& result) {
662 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
663 std::invalid_argument)
666 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
667 std::invalid_argument)
669 node.request = request;
670 node.result = &result;
672 node.model1 = &model1;
674 node.model2 = &model2;
677 node.vertices1 = model1.vertices.get() ? model1.vertices->data() : NULL;
678 node.vertices2 = model2.vertices.get() ? model2.vertices->data() : NULL;
681 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
683 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
689 tf2.getTranslation(), node.RT.R, node.RT.T);
698 template <
typename BV,
typename S>
700 BVHModel<BV>& model1, Transform3f& tf1,
const S& model2,
701 const Transform3f& tf2,
const GJKSolver* nsolver,
702 const DistanceRequest& request, DistanceResult& result,
703 bool use_refit =
false,
bool refit_bottomup =
false) {
706 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
707 std::invalid_argument)
709 if (!tf1.isIdentity() && model1.vertices.get()) {
710 const std::vector<Vec3f>& model1_vertices_ = *(model1.vertices);
711 std::vector<Vec3f> vertices_transformed1(model1.num_vertices);
712 for (
unsigned int i = 0; i < model1.num_vertices; ++i) {
713 const Vec3f& p = model1_vertices_[i];
714 Vec3f new_v = tf1.transform(p);
715 vertices_transformed1[i] = new_v;
718 model1.beginReplaceModel();
719 model1.replaceSubModel(vertices_transformed1);
720 model1.endReplaceModel(use_refit, refit_bottomup);
725 node.request = request;
726 node.result = &result;
728 node.model1 = &model1;
730 node.model2 = &model2;
732 node.nsolver = nsolver;
734 node.vertices = model1.vertices.get() ? model1.vertices->data() : NULL;
736 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
746 template <
typename BV,
typename S,
template <
typename>
class OrientedNode>
747 static inline bool setupMeshShapeDistanceOrientedNode(
748 OrientedNode<S>& node,
const BVHModel<BV>& model1,
const Transform3f& tf1,
749 const S& model2,
const Transform3f& tf2,
const GJKSolver* nsolver,
750 const DistanceRequest& request, DistanceResult& result) {
753 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
754 std::invalid_argument)
756 node.request = request;
757 node.result = &result;
759 node.model1 = &model1;
761 node.model2 = &model2;
763 node.nsolver = nsolver;
767 node.vertices = model1.vertices.get() ? model1.vertices->data() : NULL;
769 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
778 template <
typename S>
780 const BVHModel<RSS>& model1,
const Transform3f& tf1,
781 const S& model2,
const Transform3f& tf2,
782 const GJKSolver* nsolver,
const DistanceRequest& request,
783 DistanceResult& result) {
784 return details::setupMeshShapeDistanceOrientedNode(
785 node, model1, tf1, model2, tf2, nsolver, request, result);
790 template <
typename S>
792 const BVHModel<kIOS>& model1,
const Transform3f& tf1,
793 const S& model2,
const Transform3f& tf2,
794 const GJKSolver* nsolver,
const DistanceRequest& request,
795 DistanceResult& result) {
796 return details::setupMeshShapeDistanceOrientedNode(
797 node, model1, tf1, model2, tf2, nsolver, request, result);
802 template <
typename S>
804 const BVHModel<OBBRSS>& model1,
const Transform3f& tf1,
805 const S& model2,
const Transform3f& tf2,
806 const GJKSolver* nsolver,
const DistanceRequest& request,
807 DistanceResult& result) {
808 return details::setupMeshShapeDistanceOrientedNode(
809 node, model1, tf1, model2, tf2, nsolver, request, result);
Definition: traversal_node_bvh_shape.h:422
#define HPP_FCL_COMPILER_DIAGNOSTIC_PUSH
Definition: fwd.hh:120
#define HPP_FCL_COMPILER_DIAGNOSTIC_POP
Definition: fwd.hh:121
#define HPP_FCL_COMPILER_DIAGNOSTIC_IGNORED_MAYBE_UNINITIALIZED
Definition: fwd.hh:123
#define HPP_FCL_THROW_PRETTY(message, exception)
Definition: fwd.hh:64
void computeBV(const S &s, const Transform3f &tf, BV &bv)
calculate a bounding volume for a shape in a specific configuration
Definition: geometric_shapes_utility.h:74
Eigen::Matrix< FCL_REAL, 3, 1 > Vec3f
Definition: data_types.h:67
@ BVH_MODEL_TRIANGLES
unknown model type
Definition: BVH_internal.h:82
void relativeTransform(const Eigen::MatrixBase< Derived > &R1, const Eigen::MatrixBase< OtherDerived > &t1, const Eigen::MatrixBase< Derived > &R2, const Eigen::MatrixBase< OtherDerived > &t2, const Eigen::MatrixBase< Derived > &R, const Eigen::MatrixBase< OtherDerived > &t)
Definition: tools.h:91
Main namespace.
Definition: broadphase_bruteforce.h:44
bool initialize(MeshCollisionTraversalNode< BV, RelativeTransformationIsIdentity > &node, BVHModel< BV > &model1, Transform3f &tf1, BVHModel< BV > &model2, Transform3f &tf2, CollisionResult &result, bool use_refit=false, bool refit_bottomup=false)
Initialize traversal node for collision between two meshes, given the current transforms.
Definition: traversal_node_setup.h:468