Collision Checker
collision_solver_default.cc
Go to the documentation of this file.
5 
6 namespace collision {
7 namespace solvers {
8 namespace solverDefault {
9 
10 std::size_t collide_tvobst_obj(const CollisionObject &obj1,
11  const CollisionObject &obj2,
12  CollisionResult &res,
13  const CollisionRequest &req) {
14  static solvers::DefaultSolver solver;
15  static CollisionFunctionMatrix matr_default(&solver);
16  const TimeVariantCollisionObject &tvobst(
17  static_cast<const TimeVariantCollisionObject &>(obj1));
18  int time_idx_start = tvobst.time_start_idx();
19  int time_idx_end = tvobst.time_end_idx();
20  for (int cc1 = time_idx_start; cc1 <= time_idx_end; cc1++) {
21  CollisionObjectConstPtr cur_obj = tvobst.getObstacleAtTime(cc1);
22 
23  if (!cur_obj.get()) {
24  continue;
25  }
26 
27  if (cur_obj->getCollisionObjectClass() ==
29  return -1;
30  }
31 
32  collide_bool_func_t func = matr_default.getSolverBoolFunction(
33  cur_obj->getCollisionObjectType(), obj2.getCollisionObjectType());
34  if (!func) {
35  return -1;
36  }
37  func(*cur_obj, obj2, res, req);
38  if (res.collides()) return 0;
39  }
40  return 0;
41 }
42 
43 std::size_t collide_obj_tvobst(const CollisionObject &obj1,
44  const CollisionObject &obj2,
45  CollisionResult &res,
46  const CollisionRequest &req) {
47  return collide_tvobst_obj(obj2, obj1, res, req);
48 }
49 
50 std::size_t collide_tvobst_tvobst(const CollisionObject &obj1,
51  const CollisionObject &obj2,
52  CollisionResult &res,
53  const CollisionRequest &req) {
54  static solvers::DefaultSolver solver;
55  static CollisionFunctionMatrix matr_default(&solver);
56  const TimeVariantCollisionObject &tvobst1(
57  static_cast<const TimeVariantCollisionObject &>(obj1));
58  const TimeVariantCollisionObject &tvobst2(
59  static_cast<const TimeVariantCollisionObject &>(obj2));
60  int time_idx_start =
61  std::min(tvobst1.time_start_idx(), tvobst2.time_start_idx());
62  int time_idx_end = std::max(tvobst1.time_end_idx(), tvobst2.time_end_idx());
63 
64  for (int cc1 = time_idx_start; cc1 <= time_idx_end; cc1++) {
65  CollisionObjectConstPtr obst_1 = tvobst1.getObstacleAtTime(cc1);
66  CollisionObjectConstPtr obst_2 = tvobst2.getObstacleAtTime(cc1);
67 
68  if (!obst_1.get() || !obst_2.get()) {
69  continue;
70  }
71  if (obst_1->getCollisionObjectClass() == OBJ_CLASS_TVOBSTACLE ||
72  obst_2->getCollisionObjectClass() == OBJ_CLASS_TVOBSTACLE) {
73  return -1;
74  }
75 
76  collide_bool_func_t func = matr_default.getSolverBoolFunction(
77  obst_1->getCollisionObjectType(), obst_2->getCollisionObjectType());
78  if (!func) {
79  return -1;
80  }
81  func(*obst_1, *obst_2, res, req);
82  if (res.collides()) return 0;
83  }
84  return 0;
85 }
86 } // namespace solverDefault
87 
89  const solvers::DefaultSolver *solver) {
90  memset(m_collide_bool_function, 0,
92  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_AABB_BOX] =
94  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_OBB_BOX] =
96  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_SPHERE] =
98  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_TRIANGLE] =
100  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_POINT] =
102  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_POLYGON] =
104  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_SHAPEGROUP] =
106  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_TVOBSTACLE] =
108 
109  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_AABB_BOX] =
111  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_OBB_BOX] =
113  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_SPHERE] =
115  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_TRIANGLE] =
117  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_POINT] =
119  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_POLYGON] =
121  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_SHAPEGROUP] =
123  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_TVOBSTACLE] =
125 
126  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_AABB_BOX] =
128  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_OBB_BOX] =
130  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_SPHERE] =
132  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_TRIANGLE] =
134  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_POINT] =
136  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_POLYGON] =
138  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_SHAPEGROUP] =
140  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_TVOBSTACLE] =
142 
143  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_AABB_BOX] =
145  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_OBB_BOX] =
147  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_SPHERE] =
149  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_TRIANGLE] =
151  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_POINT] =
153  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_POLYGON] =
155  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_SHAPEGROUP] =
157  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_TVOBSTACLE] =
159 
160  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_AABB_BOX] =
162  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_OBB_BOX] =
164  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_SPHERE] =
166  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_TRIANGLE] =
168  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_POINT] =
170  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_POLYGON] =
172  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_SHAPEGROUP] =
174  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_TVOBSTACLE] =
176 
177  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_AABB_BOX] =
179  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_OBB_BOX] =
181  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_SPHERE] =
183  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_TRIANGLE] =
185  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_POINT] =
187  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_POLYGON] =
189  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_SHAPEGROUP] =
191  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_TVOBSTACLE] =
193 
194  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_AABB_BOX] =
196  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_OBB_BOX] =
198  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_SPHERE] =
200  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_TRIANGLE] =
202  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_POINT] =
204  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_POLYGON] =
206  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_SHAPEGROUP] =
208  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_TVOBSTACLE] =
210 
211  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_AABB_BOX] =
213  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_OBB_BOX] =
215  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_SPHERE] =
217  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_TRIANGLE] =
219  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_POINT] =
221  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_POLYGON] =
223  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_SHAPEGROUP] =
225  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_TVOBSTACLE] =
227 }
228 } // namespace solvers
229 } // namespace collision
collide_bool_func_t getSolverBoolFunction(CollisionObjectType obj1_type, CollisionObjectType obj2_type) const
std::size_t collide_point_aabb(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_tvobst_tvobst(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
TimeVariantCollisionObject can contain a different CollisionObject or ShapeGroup at each time step...
std::size_t collide_tvobst_obj(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_sphere_point(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_aabb_aabb(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_shape_group_shape_group(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_aabb_obb(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t(* collide_bool_func_t)(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
std::size_t collide_tvobst_tvobst(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_obb_obb(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_obb_aabb(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
Universal structure specifying collision request properties.
std::size_t collide_point_sphere(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_obj_obj(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_obj_shape_group(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
virtual CollisionObjectType getCollisionObjectType() const
std::size_t collide_shape_group_obj(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_obj_tvobst(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_obj_tvobst(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_point_point(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
CollisionFunctionMatrix(const solvers::FCLSolver *solver)
CollisionObjectConstPtr getObstacleAtTime(int time_idx) const
std::size_t collide_aabb_point(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
Base class for CollisionObjects and some of their groups.
std::size_t collide_tvobst_obj(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
Structure holding result for a collision request.
constexpr int COL_OBJECT_TYPES_COUNT