38 #ifndef FCL_NARROWPHASE_GJKSOLVERINDEP_INL_H 39 #define FCL_NARROWPHASE_GJKSOLVERINDEP_INL_H 70 struct GJKSolver_indep<double>;
74 template<
typename Shape1,
typename Shape2>
81 if (contact_points || penetration_depth || normal)
83 std::vector<ContactPoint<S>> contacts;
85 res = shapeIntersect(s1, tf1, s2, tf2, &contacts);
87 if (!contacts.empty())
90 const ContactPoint<S>& maxDepthContact = *std::max_element(contacts.begin(), contacts.end(), comparePenDepth<S>);
93 *contact_points = maxDepthContact.
pos;
95 if (penetration_depth)
99 *normal = maxDepthContact.
normal;
104 res = shapeIntersect(s1, tf1, s2, tf2,
nullptr);
111 template<
typename S,
typename Shape1,
typename Shape2>
128 shape.
toshape1.noalias() = tf2.linear().transpose() * tf1.linear();
129 shape.
toshape0 = tf1.inverse(Eigen::Isometry) * tf2;
144 for(
size_t i = 0; i < epa.
result.rank; ++i)
152 S depth = -epa.
depth;
153 contacts->emplace_back(normal, point, depth);
170 template<
typename Shape1,
typename Shape2>
179 *
this, s1, tf1, s2, tf2, contacts);
208 #define FCL_GJK_INDEP_SHAPE_SHAPE_INTERSECT_REG(SHAPE1, SHAPE2, ALG)\ 209 template <typename S>\ 210 struct ShapeIntersectIndepImpl<S, SHAPE1<S>, SHAPE2<S>>\ 213 const GJKSolver_indep<S>& ,\ 214 const SHAPE1<S>& s1,\ 215 const Transform3<S>& tf1,\ 216 const SHAPE2<S>& s2,\ 217 const Transform3<S>& tf2,\ 218 std::vector<ContactPoint<S>>* contacts)\ 220 return ALG(s1, tf1, s2, tf2, contacts);\ 224 #define FCL_GJK_INDEP_SHAPE_SHAPE_INTERSECT_INV(SHAPE1, SHAPE2, ALG)\ 225 template <typename S>\ 226 struct ShapeIntersectIndepImpl<S, SHAPE2<S>, SHAPE1<S>>\ 229 const GJKSolver_indep<S>& ,\ 230 const SHAPE2<S>& s1,\ 231 const Transform3<S>& tf1,\ 232 const SHAPE1<S>& s2,\ 233 const Transform3<S>& tf2,\ 234 std::vector<ContactPoint<S>>* contacts)\ 236 const bool res = ALG(s2, tf2, s1, tf1, contacts);\ 237 if (contacts) flipNormal(*contacts);\ 242 #define FCL_GJK_INDEP_SHAPE_INTERSECT(SHAPE, ALG)\ 243 FCL_GJK_INDEP_SHAPE_SHAPE_INTERSECT_REG(SHAPE, SHAPE, ALG) 245 #define FCL_GJK_INDEP_SHAPE_SHAPE_INTERSECT(SHAPE1, SHAPE2, ALG)\ 246 FCL_GJK_INDEP_SHAPE_SHAPE_INTERSECT_REG(SHAPE1, SHAPE2, ALG)\ 247 FCL_GJK_INDEP_SHAPE_SHAPE_INTERSECT_INV(SHAPE1, SHAPE2, ALG) 273 template <
typename S>
294 template <
typename S>
309 template <
typename S>
330 template <
typename S>
352 template<
typename S,
typename Shape>
363 S* penetration_depth,
375 shape.
toshape0 = tf.inverse(Eigen::Isometry);
390 for(
size_t i = 0; i < epa.
result.rank; ++i)
394 if(penetration_depth) *penetration_depth = -epa.
depth;
395 if(normal) *normal = -epa.
normal;
396 if(contact_points) (*contact_points).noalias() = tf * (w0 - epa.
normal*(epa.
depth *0.5));
411 template<
typename Shape>
419 S* penetration_depth,
423 *
this, s, tf, P1, P2, P3, contact_points, penetration_depth, normal);
438 S* penetration_depth,
442 s, tf, P1, P2, P3, contact_points, penetration_depth, normal);
448 template<
typename S,
typename Shape>
460 S* penetration_depth,
471 shape.
toshape1.noalias() = tf2.linear().transpose() * tf1.linear();
472 shape.
toshape0 = tf1.inverse(Eigen::Isometry) * tf2;
487 for(
size_t i = 0; i < epa.
result.rank; ++i)
491 if(penetration_depth) *penetration_depth = -epa.
depth;
492 if(normal) *normal = -epa.
normal;
493 if(contact_points) (*contact_points).noalias() = tf1 * (w0 - epa.
normal*(epa.
depth *0.5));
508 template<
typename Shape>
517 S* penetration_depth,
521 *
this, s, tf1, P1, P2, P3, tf2,
522 contact_points, penetration_depth, normal);
538 S* penetration_depth,
542 s, tf1, tf2 * P1, tf2 * P2, tf2 * P3,
543 contact_points, penetration_depth, normal);
560 S* penetration_depth,
564 s, tf1, P1, P2, P3, tf2,
565 contact_points, penetration_depth, normal);
582 S* penetration_depth,
586 s, tf1, P1, P2, P3, tf2,
587 contact_points, penetration_depth, normal);
593 template<
typename S,
typename Shape1,
typename Shape2>
612 shape.
toshape1.noalias() = tf2.linear().transpose() * tf1.linear();
613 shape.
toshape0 = tf1.inverse(Eigen::Isometry) * tf2;
623 for(
size_t i = 0; i < gjk.
getSimplex()->rank; ++i)
630 if(distance) *distance = (w0 - w1).norm();
634 if(p1) p1->noalias() = tf1 * w0;
635 if(p2) p2->noalias() = tf1 * w1;
641 if(distance) *distance = -1;
648 template<
typename Shape1,
typename Shape2>
659 *
this, s1, tf1, s2, tf2, dist, p1, p2);
665 template<
typename Shape1,
typename Shape2>
679 *
this, s1, tf1, s2, tf2, dist, p1, p2);
855 template<
typename S,
typename Shape>
877 shape.
toshape0 = tf.inverse(Eigen::Isometry);
887 for(
size_t i = 0; i < gjk.
getSimplex()->rank; ++i)
894 if(distance) *distance = (w0 - w1).norm();
902 if(distance) *distance = -1;
910 template<
typename Shape>
922 *
this, s, tf, P1, P2, P3, dist, p1, p2);
945 template<
typename S,
typename Shape>
967 shape.
toshape1.noalias() = tf2.linear().transpose() * tf1.linear();
968 shape.
toshape0 = tf1.inverse(Eigen::Isometry) * tf2;
978 for(
size_t i = 0; i < gjk.
getSimplex()->rank; ++i)
985 if(distance) *distance = (w0 - w1).norm();
986 if(p1) p1->noalias() = tf1 * w0;
987 if(p2) p2->noalias() = tf1 * w1;
992 if(distance) *distance = -1;
1000 template<
typename Shape>
1013 *
this, s, tf1, P1, P2, P3, tf2, dist, p1, p2);
1017 template<
typename S>
1033 s, tf1, P1, P2, P3, tf2, dist, p1, p2);
1038 template <
typename S>
1041 gjk_max_iterations = 128;
1043 epa_max_face_num = 128;
1044 epa_max_vertex_num = 64;
1045 epa_max_iterations = 255;
1047 enable_cached_guess =
false;
1052 template <
typename S>
1055 enable_cached_guess = if_enable;
1059 template <
typename S>
1062 cached_guess = guess;
1066 template <
typename S>
1069 return cached_guess;
Triangle stores the points instead of only indices of points.
template bool sphereCapsuleIntersect(const Sphere< double > &s1, const Transform3< double > &tf1, const Capsule< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
template bool cylinderHalfspaceIntersect(const Cylinder< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
template bool capsulePlaneIntersect(const Capsule< double > &s1, const Transform3< double > &tf1, const Plane< double > &s2, const Transform3< double > &tf2)
static bool run(const GJKSolver_indep< S > &, const Sphere< S > &s, const Transform3< S > &tf, const Vector3< S > &P1, const Vector3< S > &P2, const Vector3< S > &P3, Vector3< S > *contact_points, S *penetration_depth, Vector3< S > *normal)
Half Space: this is equivalent to the Planed in ODE. The separation plane is defined as n * x = d...
template bool halfspaceTriangleIntersect(const Halfspace< double > &s1, const Transform3< double > &tf1, const Vector3< double > &P1, const Vector3< double > &P2, const Vector3< double > &P3, const Transform3< double > &tf2, Vector3< double > *contact_points, double *penetration_depth, Vector3< double > *normal)
Simplex * getSimplex() const
get the underlying simplex using in GJK, can be used for cache in next iteration
Minkowski difference class of two shapes.
bool shapeTriangleIntersect(const Shape &s, const Transform3< S > &tf, const Vector3< S > &P1, const Vector3< S > &P2, const Vector3< S > &P3, Vector3< S > *contact_points=nullptr, S *penetration_depth=nullptr, Vector3< S > *normal=nullptr) const
intersection checking between one shape and a triangle
static bool run(const GJKSolver_indep< S > &, const Sphere< S > &s, const Transform3< S > &tf, const Vector3< S > &P1, const Vector3< S > &P2, const Vector3< S > &P3, S *dist, Vector3< S > *p1, Vector3< S > *p2)
Vector3< S > cached_guess
smart guess
void setCachedGuess(const Vector3< S > &guess) const
S gjk_max_iterations
maximum number of iterations used for GJK iterations
static bool run(const GJKSolver_indep< S > &gjkSolver, const Shape1 &s1, const Transform3< S > &tf1, const Shape2 &s2, const Transform3< S > &tf2, S *distance, Vector3< S > *p1, Vector3< S > *p2)
static bool run(const GJKSolver_indep< S > &, const Plane< S > &s1, const Transform3< S > &tf1, const Halfspace< S > &s2, const Transform3< S > &tf2, std::vector< ContactPoint< S >> *contacts)
template bool sphereHalfspaceIntersect(const Sphere< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
Eigen::Transform< S, 3, Eigen::Isometry > Transform3
template bool planeHalfspaceIntersect(const Plane< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2, Plane< double > &pl, Vector3< double > &p, Vector3< double > &d, double &penetration_depth, int &ret)
template bool capsuleHalfspaceIntersect(const Capsule< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
Vector3< S > getGuessFromSimplex() const
get the guess from current simplex
bool shapeSignedDistance(const Shape1 &s1, const Transform3< S > &tf1, const Shape2 &s2, const Transform3< S > &tf2, S *distance=nullptr, Vector3< S > *p1=nullptr, Vector3< S > *p2=nullptr) const
distance computation between two shapes
bool shapeTriangleDistance(const Shape &s, const Transform3< S > &tf, const Vector3< S > &P1, const Vector3< S > &P2, const Vector3< S > &P3, S *distance=nullptr, Vector3< S > *p1=nullptr, Vector3< S > *p2=nullptr) const
distance computation between one shape and a triangle
#define FCL_GJK_INDEP_SHAPE_INTERSECT(SHAPE, ALG)
template bool boxBoxIntersect(const Box< double > &s1, const Transform3< double > &tf1, const Box< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts_)
S gjk_tolerance
the threshold used in GJK to stop iteration
template bool planeTriangleIntersect(const Plane< double > &s1, const Transform3< double > &tf1, const Vector3< double > &P1, const Vector3< double > &P2, const Vector3< double > &P3, const Transform3< double > &tf2, Vector3< double > *contact_points, double *penetration_depth, Vector3< double > *normal)
GJKSolver_indep()
default setting for GJK algorithm
Status evaluate(GJK< S > &gjk, const Vector3< S > &guess)
const ShapeBase< S > * shapes[2]
points to two shapes
Eigen::Matrix< S, 3, 1 > Vector3
template FCL_EXPORT bool sphereSphereIntersect(const Sphere< double > &s1, const Transform3< double > &tf1, const Sphere< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
template bool spherePlaneIntersect(const Sphere< double > &s1, const Transform3< double > &tf1, const Plane< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
static bool run(const GJKSolver_indep< S > &gjkSolver, const Shape &s, const Transform3< S > &tf, const Vector3< S > &P1, const Vector3< S > &P2, const Vector3< S > &P3, S *distance, Vector3< S > *p1, Vector3< S > *p2)
static bool run(const GJKSolver_indep< S > &gjkSolver, const Shape &s, const Transform3< S > &tf, const Vector3< S > &P1, const Vector3< S > &P2, const Vector3< S > &P3, Vector3< S > *contact_points, S *penetration_depth, Vector3< S > *normal)
template bool planeIntersect(const Plane< double > &s1, const Transform3< double > &tf1, const Plane< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
template bool sphereTriangleDistance(const Sphere< double > &sp, const Transform3< double > &tf, const Vector3< double > &P1, const Vector3< double > &P2, const Vector3< double > &P3, double *dist)
bool enable_cached_guess
Whether smart guess can be provided.
template bool sphereTriangleIntersect(const Sphere< double > &s, const Transform3< double > &tf, const Vector3< double > &P1, const Vector3< double > &P2, const Vector3< double > &P3, Vector3< double > *contact_points, double *penetration_depth, Vector3< double > *normal_)
template bool coneHalfspaceIntersect(const Cone< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
FCL_DEPRECATED bool shapeIntersect(const Shape1 &s1, const Transform3< S > &tf1, const Shape2 &s2, const Transform3< S > &tf2, Vector3< S > *contact_points, S *penetration_depth, Vector3< S > *normal) const
intersection checking between two shapes
static bool run(const GJKSolver_indep< S > &, const Capsule< S > &s1, const Transform3< S > &tf1, const Sphere< S > &s2, const Transform3< S > &tf2, S *dist, Vector3< S > *p1, Vector3< S > *p2)
Vector3< S > getCachedGuess() const
template bool boxPlaneIntersect(const Box< double > &s1, const Transform3< double > &tf1, const Plane< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
template bool convexHalfspaceIntersect(const Convex< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2, Vector3< double > *contact_points, double *penetration_depth, Vector3< double > *normal)
Transform3< S > toshape0
transform from shape1 to shape0
template bool conePlaneIntersect(const Cone< double > &s1, const Transform3< double > &tf1, const Plane< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
template FCL_EXPORT bool sphereBoxIntersect(const Sphere< double > &sphere, const Transform3< double > &X_FS, const Box< double > &box, const Transform3< double > &X_FB, std::vector< ContactPoint< double >> *contacts)
Center at zero point capsule.
static bool run(const GJKSolver_indep< S > &, const Capsule< S > &s1, const Transform3< S > &tf1, const Capsule< S > &s2, const Transform3< S > &tf2, S *dist, Vector3< S > *p1, Vector3< S > *p2)
static bool run(const GJKSolver_indep< S > &, const Halfspace< S > &s1, const Transform3< S > &tf1, const Plane< S > &s2, const Transform3< S > &tf2, std::vector< ContactPoint< S >> *contacts)
template FCL_EXPORT bool sphereSphereDistance(const Sphere< double > &s1, const Transform3< double > &tf1, const Sphere< double > &s2, const Transform3< double > &tf2, double *dist, Vector3< double > *p1, Vector3< double > *p2)
template bool ellipsoidPlaneIntersect(const Ellipsoid< double > &s1, const Transform3< double > &tf1, const Plane< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
static bool run(const GJKSolver_indep< S > &, const Sphere< S > &s1, const Transform3< S > &tf1, const Capsule< S > &s2, const Transform3< S > &tf2, S *dist, Vector3< S > *p1, Vector3< S > *p2)
Center at zero point, axis aligned box.
unsigned int epa_max_iterations
maximum number of iterations used for EPA iterations
template bool halfspaceIntersect(const Halfspace< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2, Vector3< double > &p, Vector3< double > &d, Halfspace< double > &s, double &penetration_depth, int &ret)
template bool halfspacePlaneIntersect(const Halfspace< double > &s1, const Transform3< double > &tf1, const Plane< double > &s2, const Transform3< double > &tf2, Plane< double > &pl, Vector3< double > &p, Vector3< double > &d, double &penetration_depth, int &ret)
Matrix3< S > toshape1
rotation from shape0 to shape1
template void distance(DistanceTraversalNodeBase< double > *node, BVHFrontList *front_list, int qsize)
unsigned int epa_max_face_num
maximum number of simplex face used in EPA algorithm
static bool run(const GJKSolver_indep< S > &, const Sphere< S > &s1, const Transform3< S > &tf1, const Box< S > &s2, const Transform3< S > &tf2, S *dist, Vector3< S > *p1, Vector3< S > *p2)
static bool run(const GJKSolver_indep< S > &, const Sphere< S > &s1, const Transform3< S > &tf1, const Cylinder< S > &s2, const Transform3< S > &tf2, S *dist, Vector3< S > *p1, Vector3< S > *p2)
template bool boxHalfspaceIntersect(const Box< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2)
std::chrono::system_clock::time_point point
Representation of a point in time.
template bool capsuleCapsuleDistance(const Capsule< double > &s1, const Transform3< double > &tf1, const Capsule< double > &s2, const Transform3< double > &tf2, double *dist, Vector3d *p1_res, Vector3d *p2_res)
static Real gjk_default_tolerance()
Status evaluate(const MinkowskiDiff< S > &shape_, const Vector3< S > &guess)
GJK algorithm, given the initial value guess.
static bool run(const GJKSolver_indep< S > &, const Cylinder< S > &s1, const Transform3< S > &tf1, const Sphere< S > &s2, const Transform3< S > &tf2, S *dist, Vector3< S > *p1, Vector3< S > *p2)
template FCL_EXPORT bool sphereCylinderDistance(const Sphere< double > &sphere, const Transform3< double > &X_FS, const Cylinder< double > &cylinder, const Transform3< double > &X_FC, double *distance, Vector3< double > *p_FSc, Vector3< double > *p_FCs)
void enableCachedGuess(bool if_enable) const
unsigned int epa_max_vertex_num
maximum number of simplex vertex used in EPA algorithm
collision and distance solver based on GJK algorithm implemented in fcl (rewritten the code from the ...
template FCL_EXPORT bool sphereCylinderIntersect(const Sphere< double > &sphere, const Transform3< double > &X_FS, const Cylinder< double > &cylinder, const Transform3< double > &X_FC, std::vector< ContactPoint< double >> *contacts)
void ThrowDetailedConfiguration(const Shape1 &s1, const Transform3< S > &X_FS1, const Shape2 &s2, const Transform3< S > &X_FS2, const Solver &solver, const std::exception &e)
static bool run(const GJKSolver_indep< S > &, const Plane< S > &s1, const Transform3< S > &tf1, const Plane< S > &s2, const Transform3< S > &tf2, std::vector< ContactPoint< S >> *contacts)
bool shapeDistance(const Shape1 &s1, const Transform3< S > &tf1, const Shape2 &s2, const Transform3< S > &tf2, S *distance=nullptr, Vector3< S > *p1=nullptr, Vector3< S > *p2=nullptr) const
distance computation between two shapes
Center at zero point sphere.
static bool run(const GJKSolver_indep< S > &, const Sphere< S > &s1, const Transform3< S > &tf1, const Sphere< S > &s2, const Transform3< S > &tf2, S *dist, Vector3< S > *p1, Vector3< S > *p2)
template bool sphereCapsuleDistance(const Sphere< double > &s1, const Transform3< double > &tf1, const Capsule< double > &s2, const Transform3< double > &tf2, double *dist, Vector3< double > *p1, Vector3< double > *p2)
S epa_tolerance
the threshold used in EPA to stop iteration
#define FCL_GJK_INDEP_SHAPE_SHAPE_INTERSECT(SHAPE1, SHAPE2, ALG)
template bool ellipsoidHalfspaceIntersect(const Ellipsoid< double > &s1, const Transform3< double > &tf1, const Halfspace< double > &s2, const Transform3< double > &tf2, std::vector< ContactPoint< double >> *contacts)
Vector3< S > support(const Vector3< S > &d) const
support function for the pair of shapes
static bool run(const GJKSolver_indep< S > &, const Halfspace< S > &s1, const Transform3< S > &tf1, const Halfspace< S > &s2, const Transform3< S > &tf2, std::vector< ContactPoint< S >> *contacts)
static bool run(const GJKSolver_indep< S > &gjkSolver, const Shape1 &s1, const Transform3< S > &tf1, const Shape2 &s2, const Transform3< S > &tf2, std::vector< ContactPoint< S >> *contacts)
template bool cylinderPlaneIntersect(const Cylinder< double > &s1, const Transform3< double > &tf1, const Plane< double > &s2, const Transform3< double > &tf2)
static bool run(const GJKSolver_indep< S > &, const Box< S > &s1, const Transform3< S > &tf1, const Sphere< S > &s2, const Transform3< S > &tf2, S *dist, Vector3< S > *p1, Vector3< S > *p2)
template FCL_EXPORT bool sphereBoxDistance(const Sphere< double > &sphere, const Transform3< double > &X_FS, const Box< double > &box, const Transform3< double > &X_FB, double *distance, Vector3< double > *p_FSb, Vector3< double > *p_FBs)