00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00037 #include "fcl/distance_func_matrix.h"
00038
00039 #include "fcl/collision_node.h"
00040 #include "fcl/traversal/traversal_node_setup.h"
00041 #include "fcl/narrowphase/narrowphase.h"
00042
00043 namespace fcl
00044 {
00045
00046 #if FCL_HAVE_OCTOMAP
00047 template<typename T_SH, typename NarrowPhaseSolver>
00048 FCL_REAL ShapeOcTreeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00049 const DistanceRequest& request, DistanceResult& result)
00050 {
00051 if(request.isSatisfied(result)) return result.min_distance;
00052 ShapeOcTreeDistanceTraversalNode<T_SH, NarrowPhaseSolver> node;
00053 const T_SH* obj1 = static_cast<const T_SH*>(o1);
00054 const OcTree* obj2 = static_cast<const OcTree*>(o2);
00055 OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
00056
00057 initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
00058 distance(&node);
00059
00060 return result.min_distance;
00061 }
00062
00063 template<typename T_SH, typename NarrowPhaseSolver>
00064 FCL_REAL OcTreeShapeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00065 const DistanceRequest& request, DistanceResult& result)
00066 {
00067 if(request.isSatisfied(result)) return result.min_distance;
00068 OcTreeShapeDistanceTraversalNode<T_SH, NarrowPhaseSolver> node;
00069 const OcTree* obj1 = static_cast<const OcTree*>(o1);
00070 const T_SH* obj2 = static_cast<const T_SH*>(o2);
00071 OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
00072
00073 initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
00074 distance(&node);
00075
00076 return result.min_distance;
00077 }
00078
00079 template<typename NarrowPhaseSolver>
00080 FCL_REAL OcTreeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00081 const DistanceRequest& request, DistanceResult& result)
00082 {
00083 if(request.isSatisfied(result)) return result.min_distance;
00084 OcTreeDistanceTraversalNode<NarrowPhaseSolver> node;
00085 const OcTree* obj1 = static_cast<const OcTree*>(o1);
00086 const OcTree* obj2 = static_cast<const OcTree*>(o2);
00087 OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
00088
00089 initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
00090 distance(&node);
00091
00092 return result.min_distance;
00093 }
00094
00095 template<typename T_BVH, typename NarrowPhaseSolver>
00096 FCL_REAL BVHOcTreeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00097 const DistanceRequest& request, DistanceResult& result)
00098 {
00099 if(request.isSatisfied(result)) return result.min_distance;
00100 MeshOcTreeDistanceTraversalNode<T_BVH, NarrowPhaseSolver> node;
00101 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>*>(o1);
00102 const OcTree* obj2 = static_cast<const OcTree*>(o2);
00103 OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
00104
00105 initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
00106 distance(&node);
00107
00108 return result.min_distance;
00109 }
00110
00111 template<typename T_BVH, typename NarrowPhaseSolver>
00112 FCL_REAL OcTreeBVHDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00113 const DistanceRequest& request, DistanceResult& result)
00114 {
00115 if(request.isSatisfied(result)) return result.min_distance;
00116 OcTreeMeshDistanceTraversalNode<T_BVH, NarrowPhaseSolver> node;
00117 const OcTree* obj1 = static_cast<const OcTree*>(o1);
00118 const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>*>(o2);
00119 OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver);
00120
00121 initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
00122 distance(&node);
00123
00124 return result.min_distance;
00125 }
00126
00127 #endif
00128
00129 template<typename T_SH1, typename T_SH2, typename NarrowPhaseSolver>
00130 FCL_REAL ShapeShapeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00131 const DistanceRequest& request, DistanceResult& result)
00132 {
00133 if(request.isSatisfied(result)) return result.min_distance;
00134 ShapeDistanceTraversalNode<T_SH1, T_SH2, NarrowPhaseSolver> node;
00135 const T_SH1* obj1 = static_cast<const T_SH1*>(o1);
00136 const T_SH2* obj2 = static_cast<const T_SH2*>(o2);
00137
00138 initialize(node, *obj1, tf1, *obj2, tf2, nsolver, request, result);
00139 distance(&node);
00140
00141 return result.min_distance;
00142 }
00143
00144 template<typename T_BVH, typename T_SH, typename NarrowPhaseSolver>
00145 struct BVHShapeDistancer
00146 {
00147 static FCL_REAL distance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00148 const DistanceRequest& request, DistanceResult& result)
00149 {
00150 if(request.isSatisfied(result)) return result.min_distance;
00151 MeshShapeDistanceTraversalNode<T_BVH, T_SH, NarrowPhaseSolver> node;
00152 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1);
00153 BVHModel<T_BVH>* obj1_tmp = new BVHModel<T_BVH>(*obj1);
00154 Transform3f tf1_tmp = tf1;
00155 const T_SH* obj2 = static_cast<const T_SH*>(o2);
00156
00157 initialize(node, *obj1_tmp, tf1_tmp, *obj2, tf2, nsolver, request, result);
00158 fcl::distance(&node);
00159
00160 delete obj1_tmp;
00161 return result.min_distance;
00162 }
00163 };
00164
00165 namespace details
00166 {
00167
00168 template<typename OrientedMeshShapeDistanceTraversalNode, typename T_BVH, typename T_SH, typename NarrowPhaseSolver>
00169 FCL_REAL orientedBVHShapeDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00170 const DistanceRequest& request, DistanceResult& result)
00171 {
00172 if(request.isSatisfied(result)) return result.min_distance;
00173 OrientedMeshShapeDistanceTraversalNode node;
00174 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1);
00175 const T_SH* obj2 = static_cast<const T_SH*>(o2);
00176
00177 initialize(node, *obj1, tf1, *obj2, tf2, nsolver, request, result);
00178 fcl::distance(&node);
00179
00180 return result.min_distance;
00181 }
00182
00183 }
00184
00185 template<typename T_SH, typename NarrowPhaseSolver>
00186 struct BVHShapeDistancer<RSS, T_SH, NarrowPhaseSolver>
00187 {
00188 static FCL_REAL distance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00189 const DistanceRequest& request, DistanceResult& result)
00190 {
00191 return details::orientedBVHShapeDistance<MeshShapeDistanceTraversalNodeRSS<T_SH, NarrowPhaseSolver>, RSS, T_SH, NarrowPhaseSolver>(o1, tf1, o2, tf2, nsolver, request, result);
00192 }
00193 };
00194
00195
00196 template<typename T_SH, typename NarrowPhaseSolver>
00197 struct BVHShapeDistancer<kIOS, T_SH, NarrowPhaseSolver>
00198 {
00199 static FCL_REAL distance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00200 const DistanceRequest& request, DistanceResult& result)
00201 {
00202 return details::orientedBVHShapeDistance<MeshShapeDistanceTraversalNodekIOS<T_SH, NarrowPhaseSolver>, kIOS, T_SH, NarrowPhaseSolver>(o1, tf1, o2, tf2, nsolver, request, result);
00203 }
00204 };
00205
00206 template<typename T_SH, typename NarrowPhaseSolver>
00207 struct BVHShapeDistancer<OBBRSS, T_SH, NarrowPhaseSolver>
00208 {
00209 static FCL_REAL distance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver,
00210 const DistanceRequest& request, DistanceResult& result)
00211 {
00212 return details::orientedBVHShapeDistance<MeshShapeDistanceTraversalNodeOBBRSS<T_SH, NarrowPhaseSolver>, OBBRSS, T_SH, NarrowPhaseSolver>(o1, tf1, o2, tf2, nsolver, request, result);
00213 }
00214 };
00215
00216
00217 template<typename T_BVH>
00218 FCL_REAL BVHDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2,
00219 const DistanceRequest& request, DistanceResult& result)
00220 {
00221 if(request.isSatisfied(result)) return result.min_distance;
00222 MeshDistanceTraversalNode<T_BVH> node;
00223 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1);
00224 const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>* >(o2);
00225 BVHModel<T_BVH>* obj1_tmp = new BVHModel<T_BVH>(*obj1);
00226 Transform3f tf1_tmp = tf1;
00227 BVHModel<T_BVH>* obj2_tmp = new BVHModel<T_BVH>(*obj2);
00228 Transform3f tf2_tmp = tf2;
00229
00230 initialize(node, *obj1_tmp, tf1_tmp, *obj2_tmp, tf2_tmp, request, result);
00231 distance(&node);
00232
00233 return result.min_distance;
00234 }
00235
00236 namespace details
00237 {
00238 template<typename OrientedMeshDistanceTraversalNode, typename T_BVH>
00239 FCL_REAL orientedMeshDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2,
00240 const DistanceRequest& request, DistanceResult& result)
00241 {
00242 if(request.isSatisfied(result)) return result.min_distance;
00243 OrientedMeshDistanceTraversalNode node;
00244 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1);
00245 const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>* >(o2);
00246
00247 initialize(node, *obj1, tf1, *obj2, tf2, request, result);
00248 distance(&node);
00249
00250 return result.min_distance;
00251 }
00252
00253 }
00254
00255 template<>
00256 FCL_REAL BVHDistance<RSS>(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2,
00257 const DistanceRequest& request, DistanceResult& result)
00258 {
00259 return details::orientedMeshDistance<MeshDistanceTraversalNodeRSS, RSS>(o1, tf1, o2, tf2, request, result);
00260 }
00261
00262 template<>
00263 FCL_REAL BVHDistance<kIOS>(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2,
00264 const DistanceRequest& request, DistanceResult& result)
00265 {
00266 return details::orientedMeshDistance<MeshDistanceTraversalNodekIOS, kIOS>(o1, tf1, o2, tf2, request, result);
00267 }
00268
00269
00270 template<>
00271 FCL_REAL BVHDistance<OBBRSS>(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2,
00272 const DistanceRequest& request, DistanceResult& result)
00273 {
00274 return details::orientedMeshDistance<MeshDistanceTraversalNodeOBBRSS, OBBRSS>(o1, tf1, o2, tf2, request, result);
00275 }
00276
00277
00278 template<typename T_BVH, typename NarrowPhaseSolver>
00279 FCL_REAL BVHDistance(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2,
00280 const NarrowPhaseSolver* nsolver,
00281 const DistanceRequest& request, DistanceResult& result)
00282 {
00283 return BVHDistance<T_BVH>(o1, tf1, o2, tf2, request, result);
00284 }
00285
00286 template<typename NarrowPhaseSolver>
00287 DistanceFunctionMatrix<NarrowPhaseSolver>::DistanceFunctionMatrix()
00288 {
00289 for(int i = 0; i < NODE_COUNT; ++i)
00290 {
00291 for(int j = 0; j < NODE_COUNT; ++j)
00292 distance_matrix[i][j] = NULL;
00293 }
00294
00295 distance_matrix[GEOM_BOX][GEOM_BOX] = &ShapeShapeDistance<Box, Box, NarrowPhaseSolver>;
00296 distance_matrix[GEOM_BOX][GEOM_SPHERE] = &ShapeShapeDistance<Box, Sphere, NarrowPhaseSolver>;
00297 distance_matrix[GEOM_BOX][GEOM_CAPSULE] = &ShapeShapeDistance<Box, Capsule, NarrowPhaseSolver>;
00298 distance_matrix[GEOM_BOX][GEOM_CONE] = &ShapeShapeDistance<Box, Cone, NarrowPhaseSolver>;
00299 distance_matrix[GEOM_BOX][GEOM_CYLINDER] = &ShapeShapeDistance<Box, Cylinder, NarrowPhaseSolver>;
00300 distance_matrix[GEOM_BOX][GEOM_CONVEX] = &ShapeShapeDistance<Box, Convex, NarrowPhaseSolver>;
00301 distance_matrix[GEOM_BOX][GEOM_PLANE] = &ShapeShapeDistance<Box, Plane, NarrowPhaseSolver>;
00302
00303 distance_matrix[GEOM_SPHERE][GEOM_BOX] = &ShapeShapeDistance<Sphere, Box, NarrowPhaseSolver>;
00304 distance_matrix[GEOM_SPHERE][GEOM_SPHERE] = &ShapeShapeDistance<Sphere, Sphere, NarrowPhaseSolver>;
00305 distance_matrix[GEOM_SPHERE][GEOM_CAPSULE] = &ShapeShapeDistance<Sphere, Capsule, NarrowPhaseSolver>;
00306 distance_matrix[GEOM_SPHERE][GEOM_CONE] = &ShapeShapeDistance<Sphere, Cone, NarrowPhaseSolver>;
00307 distance_matrix[GEOM_SPHERE][GEOM_CYLINDER] = &ShapeShapeDistance<Sphere, Cylinder, NarrowPhaseSolver>;
00308 distance_matrix[GEOM_SPHERE][GEOM_CONVEX] = &ShapeShapeDistance<Sphere, Convex, NarrowPhaseSolver>;
00309 distance_matrix[GEOM_SPHERE][GEOM_PLANE] = &ShapeShapeDistance<Sphere, Plane, NarrowPhaseSolver>;
00310
00311 distance_matrix[GEOM_CAPSULE][GEOM_BOX] = &ShapeShapeDistance<Capsule, Box, NarrowPhaseSolver>;
00312 distance_matrix[GEOM_CAPSULE][GEOM_SPHERE] = &ShapeShapeDistance<Capsule, Sphere, NarrowPhaseSolver>;
00313 distance_matrix[GEOM_CAPSULE][GEOM_CAPSULE] = &ShapeShapeDistance<Capsule, Capsule, NarrowPhaseSolver>;
00314 distance_matrix[GEOM_CAPSULE][GEOM_CONE] = &ShapeShapeDistance<Capsule, Cone, NarrowPhaseSolver>;
00315 distance_matrix[GEOM_CAPSULE][GEOM_CYLINDER] = &ShapeShapeDistance<Capsule, Cylinder, NarrowPhaseSolver>;
00316 distance_matrix[GEOM_CAPSULE][GEOM_CONVEX] = &ShapeShapeDistance<Capsule, Convex, NarrowPhaseSolver>;
00317 distance_matrix[GEOM_CAPSULE][GEOM_PLANE] = &ShapeShapeDistance<Capsule, Plane, NarrowPhaseSolver>;
00318
00319 distance_matrix[GEOM_CONE][GEOM_BOX] = &ShapeShapeDistance<Cone, Box, NarrowPhaseSolver>;
00320 distance_matrix[GEOM_CONE][GEOM_SPHERE] = &ShapeShapeDistance<Cone, Sphere, NarrowPhaseSolver>;
00321 distance_matrix[GEOM_CONE][GEOM_CAPSULE] = &ShapeShapeDistance<Cone, Capsule, NarrowPhaseSolver>;
00322 distance_matrix[GEOM_CONE][GEOM_CONE] = &ShapeShapeDistance<Cone, Cone, NarrowPhaseSolver>;
00323 distance_matrix[GEOM_CONE][GEOM_CYLINDER] = &ShapeShapeDistance<Cone, Cylinder, NarrowPhaseSolver>;
00324 distance_matrix[GEOM_CONE][GEOM_CONVEX] = &ShapeShapeDistance<Cone, Convex, NarrowPhaseSolver>;
00325 distance_matrix[GEOM_CONE][GEOM_PLANE] = &ShapeShapeDistance<Cone, Plane, NarrowPhaseSolver>;
00326
00327 distance_matrix[GEOM_CYLINDER][GEOM_BOX] = &ShapeShapeDistance<Cylinder, Box, NarrowPhaseSolver>;
00328 distance_matrix[GEOM_CYLINDER][GEOM_SPHERE] = &ShapeShapeDistance<Cylinder, Sphere, NarrowPhaseSolver>;
00329 distance_matrix[GEOM_CYLINDER][GEOM_CAPSULE] = &ShapeShapeDistance<Cylinder, Capsule, NarrowPhaseSolver>;
00330 distance_matrix[GEOM_CYLINDER][GEOM_CONE] = &ShapeShapeDistance<Cylinder, Cone, NarrowPhaseSolver>;
00331 distance_matrix[GEOM_CYLINDER][GEOM_CYLINDER] = &ShapeShapeDistance<Cylinder, Cylinder, NarrowPhaseSolver>;
00332 distance_matrix[GEOM_CYLINDER][GEOM_CONVEX] = &ShapeShapeDistance<Cylinder, Convex, NarrowPhaseSolver>;
00333 distance_matrix[GEOM_CYLINDER][GEOM_PLANE] = &ShapeShapeDistance<Cylinder, Plane, NarrowPhaseSolver>;
00334
00335 distance_matrix[GEOM_CONVEX][GEOM_BOX] = &ShapeShapeDistance<Convex, Box, NarrowPhaseSolver>;
00336 distance_matrix[GEOM_CONVEX][GEOM_SPHERE] = &ShapeShapeDistance<Convex, Sphere, NarrowPhaseSolver>;
00337 distance_matrix[GEOM_CONVEX][GEOM_CAPSULE] = &ShapeShapeDistance<Convex, Capsule, NarrowPhaseSolver>;
00338 distance_matrix[GEOM_CONVEX][GEOM_CONE] = &ShapeShapeDistance<Convex, Cone, NarrowPhaseSolver>;
00339 distance_matrix[GEOM_CONVEX][GEOM_CYLINDER] = &ShapeShapeDistance<Convex, Cylinder, NarrowPhaseSolver>;
00340 distance_matrix[GEOM_CONVEX][GEOM_CONVEX] = &ShapeShapeDistance<Convex, Convex, NarrowPhaseSolver>;
00341 distance_matrix[GEOM_CONVEX][GEOM_PLANE] = &ShapeShapeDistance<Convex, Plane, NarrowPhaseSolver>;
00342
00343 distance_matrix[GEOM_PLANE][GEOM_BOX] = &ShapeShapeDistance<Plane, Box, NarrowPhaseSolver>;
00344 distance_matrix[GEOM_PLANE][GEOM_SPHERE] = &ShapeShapeDistance<Plane, Sphere, NarrowPhaseSolver>;
00345 distance_matrix[GEOM_PLANE][GEOM_CAPSULE] = &ShapeShapeDistance<Plane, Capsule, NarrowPhaseSolver>;
00346 distance_matrix[GEOM_PLANE][GEOM_CONE] = &ShapeShapeDistance<Plane, Cone, NarrowPhaseSolver>;
00347 distance_matrix[GEOM_PLANE][GEOM_CYLINDER] = &ShapeShapeDistance<Plane, Cylinder, NarrowPhaseSolver>;
00348 distance_matrix[GEOM_PLANE][GEOM_CONVEX] = &ShapeShapeDistance<Plane, Convex, NarrowPhaseSolver>;
00349 distance_matrix[GEOM_PLANE][GEOM_PLANE] = &ShapeShapeDistance<Plane, Plane, NarrowPhaseSolver>;
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 distance_matrix[BV_RSS][GEOM_BOX] = &BVHShapeDistancer<RSS, Box, NarrowPhaseSolver>::distance;
00371 distance_matrix[BV_RSS][GEOM_SPHERE] = &BVHShapeDistancer<RSS, Sphere, NarrowPhaseSolver>::distance;
00372 distance_matrix[BV_RSS][GEOM_CAPSULE] = &BVHShapeDistancer<RSS, Capsule, NarrowPhaseSolver>::distance;
00373 distance_matrix[BV_RSS][GEOM_CONE] = &BVHShapeDistancer<RSS, Cone, NarrowPhaseSolver>::distance;
00374 distance_matrix[BV_RSS][GEOM_CYLINDER] = &BVHShapeDistancer<RSS, Cylinder, NarrowPhaseSolver>::distance;
00375 distance_matrix[BV_RSS][GEOM_CONVEX] = &BVHShapeDistancer<RSS, Convex, NarrowPhaseSolver>::distance;
00376 distance_matrix[BV_RSS][GEOM_PLANE] = &BVHShapeDistancer<RSS, Plane, NarrowPhaseSolver>::distance;
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405 distance_matrix[BV_kIOS][GEOM_BOX] = &BVHShapeDistancer<kIOS, Box, NarrowPhaseSolver>::distance;
00406 distance_matrix[BV_kIOS][GEOM_SPHERE] = &BVHShapeDistancer<kIOS, Sphere, NarrowPhaseSolver>::distance;
00407 distance_matrix[BV_kIOS][GEOM_CAPSULE] = &BVHShapeDistancer<kIOS, Capsule, NarrowPhaseSolver>::distance;
00408 distance_matrix[BV_kIOS][GEOM_CONE] = &BVHShapeDistancer<kIOS, Cone, NarrowPhaseSolver>::distance;
00409 distance_matrix[BV_kIOS][GEOM_CYLINDER] = &BVHShapeDistancer<kIOS, Cylinder, NarrowPhaseSolver>::distance;
00410 distance_matrix[BV_kIOS][GEOM_CONVEX] = &BVHShapeDistancer<kIOS, Convex, NarrowPhaseSolver>::distance;
00411 distance_matrix[BV_kIOS][GEOM_PLANE] = &BVHShapeDistancer<kIOS, Plane, NarrowPhaseSolver>::distance;
00412
00413 distance_matrix[BV_OBBRSS][GEOM_BOX] = &BVHShapeDistancer<OBBRSS, Box, NarrowPhaseSolver>::distance;
00414 distance_matrix[BV_OBBRSS][GEOM_SPHERE] = &BVHShapeDistancer<OBBRSS, Sphere, NarrowPhaseSolver>::distance;
00415 distance_matrix[BV_OBBRSS][GEOM_CAPSULE] = &BVHShapeDistancer<OBBRSS, Capsule, NarrowPhaseSolver>::distance;
00416 distance_matrix[BV_OBBRSS][GEOM_CONE] = &BVHShapeDistancer<OBBRSS, Cone, NarrowPhaseSolver>::distance;
00417 distance_matrix[BV_OBBRSS][GEOM_CYLINDER] = &BVHShapeDistancer<OBBRSS, Cylinder, NarrowPhaseSolver>::distance;
00418 distance_matrix[BV_OBBRSS][GEOM_CONVEX] = &BVHShapeDistancer<OBBRSS, Convex, NarrowPhaseSolver>::distance;
00419 distance_matrix[BV_OBBRSS][GEOM_PLANE] = &BVHShapeDistancer<OBBRSS, Plane, NarrowPhaseSolver>::distance;
00420
00421 distance_matrix[BV_AABB][BV_AABB] = &BVHDistance<AABB, NarrowPhaseSolver>;
00422 distance_matrix[BV_RSS][BV_RSS] = &BVHDistance<RSS, NarrowPhaseSolver>;
00423 distance_matrix[BV_kIOS][BV_kIOS] = &BVHDistance<kIOS, NarrowPhaseSolver>;
00424 distance_matrix[BV_OBBRSS][BV_OBBRSS] = &BVHDistance<OBBRSS, NarrowPhaseSolver>;
00425
00426 #if FCL_HAVE_OCTOMAP
00427 distance_matrix[GEOM_OCTREE][GEOM_BOX] = &OcTreeShapeDistance<Box, NarrowPhaseSolver>;
00428 distance_matrix[GEOM_OCTREE][GEOM_SPHERE] = &OcTreeShapeDistance<Sphere, NarrowPhaseSolver>;
00429 distance_matrix[GEOM_OCTREE][GEOM_CAPSULE] = &OcTreeShapeDistance<Capsule, NarrowPhaseSolver>;
00430 distance_matrix[GEOM_OCTREE][GEOM_CONE] = &OcTreeShapeDistance<Cone, NarrowPhaseSolver>;
00431 distance_matrix[GEOM_OCTREE][GEOM_CYLINDER] = &OcTreeShapeDistance<Cylinder, NarrowPhaseSolver>;
00432 distance_matrix[GEOM_OCTREE][GEOM_CONVEX] = &OcTreeShapeDistance<Convex, NarrowPhaseSolver>;
00433 distance_matrix[GEOM_OCTREE][GEOM_PLANE] = &OcTreeShapeDistance<Plane, NarrowPhaseSolver>;
00434
00435 distance_matrix[GEOM_BOX][GEOM_OCTREE] = &ShapeOcTreeDistance<Box, NarrowPhaseSolver>;
00436 distance_matrix[GEOM_SPHERE][GEOM_OCTREE] = &ShapeOcTreeDistance<Sphere, NarrowPhaseSolver>;
00437 distance_matrix[GEOM_CAPSULE][GEOM_OCTREE] = &ShapeOcTreeDistance<Capsule, NarrowPhaseSolver>;
00438 distance_matrix[GEOM_CONE][GEOM_OCTREE] = &ShapeOcTreeDistance<Cone, NarrowPhaseSolver>;
00439 distance_matrix[GEOM_CYLINDER][GEOM_OCTREE] = &ShapeOcTreeDistance<Cylinder, NarrowPhaseSolver>;
00440 distance_matrix[GEOM_CONVEX][GEOM_OCTREE] = &ShapeOcTreeDistance<Convex, NarrowPhaseSolver>;
00441 distance_matrix[GEOM_PLANE][GEOM_OCTREE] = &ShapeOcTreeDistance<Plane, NarrowPhaseSolver>;
00442
00443 distance_matrix[GEOM_OCTREE][GEOM_OCTREE] = &OcTreeDistance<NarrowPhaseSolver>;
00444
00445 distance_matrix[GEOM_OCTREE][BV_AABB] = &OcTreeBVHDistance<AABB, NarrowPhaseSolver>;
00446 distance_matrix[GEOM_OCTREE][BV_OBB] = &OcTreeBVHDistance<OBB, NarrowPhaseSolver>;
00447 distance_matrix[GEOM_OCTREE][BV_RSS] = &OcTreeBVHDistance<RSS, NarrowPhaseSolver>;
00448 distance_matrix[GEOM_OCTREE][BV_OBBRSS] = &OcTreeBVHDistance<OBBRSS, NarrowPhaseSolver>;
00449 distance_matrix[GEOM_OCTREE][BV_kIOS] = &OcTreeBVHDistance<kIOS, NarrowPhaseSolver>;
00450 distance_matrix[GEOM_OCTREE][BV_KDOP16] = &OcTreeBVHDistance<KDOP<16>, NarrowPhaseSolver>;
00451 distance_matrix[GEOM_OCTREE][BV_KDOP18] = &OcTreeBVHDistance<KDOP<18>, NarrowPhaseSolver>;
00452 distance_matrix[GEOM_OCTREE][BV_KDOP24] = &OcTreeBVHDistance<KDOP<24>, NarrowPhaseSolver>;
00453
00454 distance_matrix[BV_AABB][GEOM_OCTREE] = &BVHOcTreeDistance<AABB, NarrowPhaseSolver>;
00455 distance_matrix[BV_OBB][GEOM_OCTREE] = &BVHOcTreeDistance<OBB, NarrowPhaseSolver>;
00456 distance_matrix[BV_RSS][GEOM_OCTREE] = &BVHOcTreeDistance<RSS, NarrowPhaseSolver>;
00457 distance_matrix[BV_OBBRSS][GEOM_OCTREE] = &BVHOcTreeDistance<OBBRSS, NarrowPhaseSolver>;
00458 distance_matrix[BV_kIOS][GEOM_OCTREE] = &BVHOcTreeDistance<kIOS, NarrowPhaseSolver>;
00459 distance_matrix[BV_KDOP16][GEOM_OCTREE] = &BVHOcTreeDistance<KDOP<16>, NarrowPhaseSolver>;
00460 distance_matrix[BV_KDOP18][GEOM_OCTREE] = &BVHOcTreeDistance<KDOP<18>, NarrowPhaseSolver>;
00461 distance_matrix[BV_KDOP24][GEOM_OCTREE] = &BVHOcTreeDistance<KDOP<24>, NarrowPhaseSolver>;
00462 #endif
00463
00464
00465 }
00466
00467 template struct DistanceFunctionMatrix<GJKSolver_libccd>;
00468 template struct DistanceFunctionMatrix<GJKSolver_indep>;
00469
00470
00471 }