Choreonoid  1.1
ColdetModelPair.h
説明を見る。
1 
5 #ifndef CNOID_COLLISION_COLDET_MODEL_PAIR_H_INCLUDED
6 #define CNOID_COLLISION_COLDET_MODEL_PAIR_H_INCLUDED
7 
8 #include "CollisionData.h"
9 #include "ColdetModel.h"
10 #include "CollisionPairInserter.h"
11 #include <cnoid/Referenced>
12 #include <vector>
13 #include "exportdecl.h"
14 
15 namespace cnoid {
16 
18  {
19  public:
22  double tolerance=0);
23  ColdetModelPair(const ColdetModelPair& org);
24  virtual ~ColdetModelPair();
25 
26  void set(ColdetModelPtr model0, ColdetModelPtr model1);
27 
28  inline ColdetModel* model(int index) { return models[index].get(); }
29 
30  inline std::vector<collision_data>& detectCollisions() {
31  return detectCollisionsSub(true);
32  }
33 
34  inline std::vector<collision_data>& collisions() {
35  return collisionPairInserter.cdContact;
36  }
37 
38  inline void clearCollisions(){
39  collisionPairInserter.cdContact.clear();
40  }
41 
42  inline bool checkCollision() {
43  return !detectCollisionsSub(false).empty();
44  }
45 
46  double computeDistance(double *point0, double *point1);
47 
52  double computeDistance(int& out_triangle0, double* out_point0, int& out_triangle1, double* out_point1);
53 
54  bool detectIntersection();
55 
56  double tolerance() const { return tolerance_; }
57  void setTolerance(double tolerance){
58  tolerance_ = tolerance;
59  }
60 
61  private:
62  std::vector<collision_data>& detectCollisionsSub(bool detectAllContacts);
63  bool detectMeshMeshCollisions(bool detectAllContacts);
64  bool detectPlaneCylinderCollisions(bool detectAllContacts);
65 
66  ColdetModelPtr models[2];
67  double tolerance_;
68 
69  CollisionPairInserter collisionPairInserter;
70 
71  int boxTestsCount;
72  int triTestsCount;
73  };
74 
75  typedef boost::intrusive_ptr<ColdetModelPair> ColdetModelPairPtr;
76 }
77 
78 
79 #endif