38 #ifndef HPP_FCL_INTERNAL_SHAPE_SHAPE_FUNC_H
39 #define HPP_FCL_INTERNAL_SHAPE_SHAPE_FUNC_H
51 template <
typename ShapeType1,
typename ShapeType2>
52 struct ShapeShapeDistancer {
53 static FCL_REAL run(
const CollisionGeometry* o1,
const Transform3f& tf1,
54 const CollisionGeometry* o2,
const Transform3f& tf2,
55 const GJKSolver* nsolver,
const DistanceRequest& request,
56 DistanceResult& result) {
57 if (request.isSatisfied(result))
return result.min_distance;
63 o1, tf1, o2, tf2, nsolver, request.enable_signed_distance, p1, p2,
72 static FCL_REAL run(
const CollisionGeometry* o1,
const Transform3f& tf1,
73 const CollisionGeometry* o2,
const Transform3f& tf2,
74 const GJKSolver* nsolver,
75 const bool compute_signed_distance,
Vec3f& p1,
Vec3f& p2,
77 const ShapeType1* obj1 =
static_cast<const ShapeType1*
>(o1);
78 const ShapeType2* obj2 =
static_cast<const ShapeType2*
>(o2);
79 return nsolver->shapeDistance(*obj1, tf1, *obj2, tf2,
80 compute_signed_distance, p1, p2, normal);
91 template <
typename ShapeType1,
typename ShapeType2>
92 FCL_REAL ShapeShapeDistance(
const CollisionGeometry* o1,
const Transform3f& tf1,
93 const CollisionGeometry* o2,
const Transform3f& tf2,
94 const GJKSolver* nsolver,
95 const DistanceRequest& request,
96 DistanceResult& result) {
97 return ShapeShapeDistancer<ShapeType1, ShapeType2>::run(
98 o1, tf1, o2, tf2, nsolver, request, result);
112 template <
typename ShapeType1,
typename ShapeType2>
113 FCL_REAL ShapeShapeDistance(
const CollisionGeometry* o1,
const Transform3f& tf1,
114 const CollisionGeometry* o2,
const Transform3f& tf2,
115 const GJKSolver* nsolver,
116 const bool compute_signed_distance,
Vec3f& p1,
118 return ::hpp::fcl::ShapeShapeDistancer<ShapeType1, ShapeType2>::run(
119 o1, tf1, o2, tf2, nsolver, compute_signed_distance, p1, p2, normal);
132 template <
typename ShapeType1,
typename ShapeType2>
133 struct ShapeShapeCollider {
134 static std::size_t run(
const CollisionGeometry* o1,
const Transform3f& tf1,
135 const CollisionGeometry* o2,
const Transform3f& tf2,
136 const GJKSolver* nsolver,
137 const CollisionRequest& request,
138 CollisionResult& result) {
139 if (request.isSatisfied(result))
return result.numContacts();
141 const bool compute_penetration =
142 request.enable_contact || (request.security_margin < 0);
143 Vec3f p1, p2, normal;
145 o1, tf1, o2, tf2, nsolver, compute_penetration, p1, p2, normal);
147 size_t num_contacts = 0;
152 if (distToCollision <= request.collision_distance_threshold &&
153 result.numContacts() < request.num_max_contacts) {
154 if (result.numContacts() < request.num_max_contacts) {
157 result.addContact(contact);
159 num_contacts = result.numContacts();
166 template <
typename ShapeType1,
typename ShapeType2>
167 std::size_t ShapeShapeCollide(
const CollisionGeometry* o1,
168 const Transform3f& tf1,
169 const CollisionGeometry* o2,
170 const Transform3f& tf2,
const GJKSolver* nsolver,
171 const CollisionRequest& request,
172 CollisionResult& result) {
173 return ShapeShapeCollider<ShapeType1, ShapeType2>::run(
174 o1, tf1, o2, tf2, nsolver, request, result);
214 #define SHAPE_SHAPE_DISTANCE_SPECIALIZATION(T1, T2) \
216 HPP_FCL_DLLAPI FCL_REAL internal::ShapeShapeDistance<T1, T2>( \
217 const CollisionGeometry* o1, const Transform3f& tf1, \
218 const CollisionGeometry* o2, const Transform3f& tf2, \
219 const GJKSolver* nsolver, const bool compute_signed_distance, Vec3f& p1, \
220 Vec3f& p2, Vec3f& normal); \
222 HPP_FCL_DLLAPI FCL_REAL internal::ShapeShapeDistance<T2, T1>( \
223 const CollisionGeometry* o1, const Transform3f& tf1, \
224 const CollisionGeometry* o2, const Transform3f& tf2, \
225 const GJKSolver* nsolver, const bool compute_signed_distance, Vec3f& p1, \
226 Vec3f& p2, Vec3f& normal); \
228 inline HPP_FCL_DLLAPI FCL_REAL ShapeShapeDistance<T1, T2>( \
229 const CollisionGeometry* o1, const Transform3f& tf1, \
230 const CollisionGeometry* o2, const Transform3f& tf2, \
231 const GJKSolver* nsolver, const DistanceRequest& request, \
232 DistanceResult& result) { \
235 result.b1 = DistanceResult::NONE; \
236 result.b2 = DistanceResult::NONE; \
237 result.min_distance = internal::ShapeShapeDistance<T1, T2>( \
238 o1, tf1, o2, tf2, nsolver, request.enable_signed_distance, \
239 result.nearest_points[0], result.nearest_points[1], result.normal); \
240 return result.min_distance; \
243 inline HPP_FCL_DLLAPI FCL_REAL ShapeShapeDistance<T2, T1>( \
244 const CollisionGeometry* o1, const Transform3f& tf1, \
245 const CollisionGeometry* o2, const Transform3f& tf2, \
246 const GJKSolver* nsolver, const DistanceRequest& request, \
247 DistanceResult& result) { \
250 result.b1 = DistanceResult::NONE; \
251 result.b2 = DistanceResult::NONE; \
252 result.min_distance = internal::ShapeShapeDistance<T2, T1>( \
253 o1, tf1, o2, tf2, nsolver, request.enable_signed_distance, \
254 result.nearest_points[0], result.nearest_points[1], result.normal); \
255 return result.min_distance; \
258 #define SHAPE_SELF_DISTANCE_SPECIALIZATION(T) \
260 HPP_FCL_DLLAPI FCL_REAL internal::ShapeShapeDistance<T, T>( \
261 const CollisionGeometry* o1, const Transform3f& tf1, \
262 const CollisionGeometry* o2, const Transform3f& tf2, \
263 const GJKSolver* nsolver, const bool compute_signed_distance, Vec3f& p1, \
264 Vec3f& p2, Vec3f& normal); \
266 inline HPP_FCL_DLLAPI FCL_REAL ShapeShapeDistance<T, T>( \
267 const CollisionGeometry* o1, const Transform3f& tf1, \
268 const CollisionGeometry* o2, const Transform3f& tf2, \
269 const GJKSolver* nsolver, const DistanceRequest& request, \
270 DistanceResult& result) { \
273 result.b1 = DistanceResult::NONE; \
274 result.b2 = DistanceResult::NONE; \
275 result.min_distance = internal::ShapeShapeDistance<T, T>( \
276 o1, tf1, o2, tf2, nsolver, request.enable_signed_distance, \
277 result.nearest_points[0], result.nearest_points[1], result.normal); \
278 return result.min_distance; \
281 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Box, Halfspace)
282 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Box, Plane)
283 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Box, Sphere)
284 SHAPE_SELF_DISTANCE_SPECIALIZATION(Capsule)
285 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Capsule, Halfspace)
286 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Capsule, Plane)
287 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Cone, Halfspace)
288 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Cone, Plane)
289 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Cylinder, Halfspace)
290 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Cylinder, Plane)
291 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Sphere, Halfspace)
292 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Sphere, Plane)
293 SHAPE_SELF_DISTANCE_SPECIALIZATION(Sphere)
294 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Sphere, Cylinder)
295 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Sphere, Capsule)
296 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Ellipsoid, Halfspace)
297 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Ellipsoid, Plane)
298 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(ConvexBase, Halfspace)
299 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(ConvexBase, Plane)
300 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(TriangleP, Halfspace)
301 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(TriangleP, Plane)
302 SHAPE_SELF_DISTANCE_SPECIALIZATION(TriangleP)
303 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(TriangleP, Sphere)
304 SHAPE_SHAPE_DISTANCE_SPECIALIZATION(Plane, Halfspace)
305 SHAPE_SELF_DISTANCE_SPECIALIZATION(Plane)
306 SHAPE_SELF_DISTANCE_SPECIALIZATION(Halfspace)
308 #undef SHAPE_SHAPE_DISTANCE_SPECIALIZATION
309 #undef SHAPE_SELF_DISTANCE_SPECIALIZATION
FCL_REAL distance(const Matrix3f &R0, const Vec3f &T0, const kIOS &b1, const kIOS &b2, Vec3f *P=NULL, Vec3f *Q=NULL)
Approximate distance between two kIOS bounding volumes.
void updateDistanceLowerBoundFromLeaf(const CollisionRequest &, CollisionResult &res, const FCL_REAL &distance, const Vec3f &p0, const Vec3f &p1, const Vec3f &normal)
Definition: collision_data.h:1186
Eigen::Matrix< FCL_REAL, 3, 1 > Vec3f
Definition: data_types.h:67
double FCL_REAL
Definition: data_types.h:66
Main namespace.
Definition: broadphase_bruteforce.h:44
static const int NONE
invalid contact primitive information
Definition: collision_data.h:1088