KrisLibrary  1.0.0
CollisionMesh.h
1 #ifndef GEOMETRY_COLLISION_MESH_H
2 #define GEOMETRY_COLLISION_MESH_H
3 
4 #include <KrisLibrary/meshing/TriMeshTopology.h>
5 #include <KrisLibrary/math3d/geometry3d.h>
6 #include <limits.h>
7 
8 class PQP_Model;
9 class PQP_Results;
10 
11 namespace Geometry {
12 
13  class ApproximatePenetrationDepth;
14  using namespace Math3D;
15 
27 {
28  public:
29  CollisionMesh();
30  CollisionMesh(const CollisionMesh& model);
31  explicit CollisionMesh(const Meshing::TriMesh& mesh);
32  explicit CollisionMesh(const Meshing::TriMeshWithTopology& mesh);
33  ~CollisionMesh();
34  const CollisionMesh& operator = (const CollisionMesh& model);
35  void InitCollisions();
36  inline void UpdateTransform(const RigidTransform& f) {currentTransform = f;}
37  void GetTransform(RigidTransform& f) const {f=currentTransform; }
38 
39  PQP_Model* pqpModel;
40  RigidTransform currentTransform;
41 };
42 
54 {
55  public:
57  CollisionMeshQuery(const CollisionMesh& m1,const CollisionMesh& m2);
60  const CollisionMeshQuery& operator = (const CollisionMeshQuery& q);
61 
62  bool Collide();
63  bool CollideAll();
64  Real Distance(Real absErr,Real relErr,Real bound=Inf);
65  Real Distance_Coherent(Real absErr,Real relErr,Real bound=Inf);
66  bool WithinDistance(Real tol);
67  bool WithinDistanceAll(Real tol);
68  Real PenetrationDepth(); //note: calls CollideAll(), returns -0 if seperated
69 
70  Real Distance_Cached() const;
71  Real PenetrationDepth_Cached() const;
73  void ClosestPoints(Vector3& p1,Vector3& p2) const;
75  void ClosestPair(int& t1,int& t2) const;
77  void TolerancePoints(Vector3& p1,Vector3& p2) const;
79  void TolerancePair(int& t1,int& t2) const;
80  //d1 is the direction that m1 can move to get out of m2 (in world coords). p1 and p2 are in local coordinates, while d1 is in world coordinates
81  void PenetrationPoints(Vector3& p1,Vector3& p2,Vector3& d1) const;
82  //extracting the pairs of interacting features
83  void CollisionPairs(std::vector<int>& t1,std::vector<int>& t2) const;
85  void TolerancePoints(std::vector<Vector3>& p1,std::vector<Vector3>& t2) const;
87  void TolerancePairs(std::vector<int>& t1,std::vector<int>& t2) const;
88 
89  const CollisionMesh *m1, *m2;
90 
91  private:
92  PQP_Results* pqpResults;
93  std::vector<int> tc1,tc2; //temp, only updated on penetration depth call
94  ApproximatePenetrationDepth *penetration1,*penetration2;
95 };
96 
97 /* @brief A convenience class that allows meshes to be treated as
98  * "fattened" geometry using a given margin.
99  *
100  * Negative margins are not supported.
101  */
103 {
104  public:
109 
110  bool Collide();
111  bool CollideAll();
112  Real Distance(Real absErr,Real relErr,Real bound=Inf);
113  Real Distance_Coherent(Real absErr,Real relErr,Real bound=Inf);
114  bool WithinDistance(Real tol);
115  bool WithinDistanceAll(Real tol);
116  Real PenetrationDepth(); //note: calls CollideAll(), returns -0 if seperated
117 
118  Real Distance_Cached() const;
119  Real PenetrationDepth_Cached() const;
120  void ClosestPoints(Vector3& p1,Vector3& p2) const;
121  void TolerancePoints(Vector3& p1,Vector3& p2) const;
122  //d1 is the direction that m1 can move to get out of m2 (in world coords)
123  void PenetrationPoints(Vector3& p1,Vector3& p2,Vector3& d1) const;
124  //extracting the pairs of interacting features
125  void CollisionPairs(std::vector<int>& t1,std::vector<int>& t2) const;
126  void TolerancePairs(std::vector<int>& t1,std::vector<int>& t2) const;
127  void TolerancePoints(std::vector<Vector3>& p1,std::vector<Vector3>& t2) const;
128  Real margin1,margin2;
129 };
130 
131 
132 
136 void GetBB(const CollisionMesh& m,Box3D& bb);
138 
141 int Collide(const CollisionMesh& m,const Segment3D& s,Vector3& pt);
143 bool Collide(const CollisionMesh& m,const Sphere3D& s);
144 bool Collide(const CollisionMesh& m,const AABB3D& b);
145 bool Collide(const CollisionMesh& m,const Box3D& b);
146 bool Collide(const CollisionMesh& m1,const CollisionMesh& m2);
147 bool Collide(const CollisionMesh& m,const GeometricPrimitive3D& g);
148 
151 int RayCast(const CollisionMesh& m,const Ray3D& r,Vector3& pt);
152 
155 int RayCastLocal(const CollisionMesh& m,const Ray3D& r,Vector3& pt);
156 
158 void CollideAll(const CollisionMesh& m,const Sphere3D& s,std::vector<int>& tris,int max=INT_MAX);
159 void CollideAll(const CollisionMesh& m,const Segment3D& s,std::vector<int>& tris,int max=INT_MAX);
160 void CollideAll(const CollisionMesh& m,const AABB3D& bb,std::vector<int>& tris,int max=INT_MAX);
161 void CollideAll(const CollisionMesh& m,const Box3D& b,std::vector<int>& tris,int max=INT_MAX);
162 void CollideAll(const CollisionMesh& m,const GeometricPrimitive3D& g,std::vector<int>& tris,int max=INT_MAX);
163 
164 
165 
167 bool WithinDistance(const CollisionMesh& m,const Vector3& p,Real d);
168 bool WithinDistance(const CollisionMesh& m,const GeometricPrimitive3D& g,Real d);
169 bool WithinDistance(const CollisionMesh& m1,const CollisionMesh& m2,Real d);
170 
172 void NearbyTriangles(const CollisionMesh& m,const Vector3& p,Real d,std::vector<int>& tris,int max=INT_MAX);
173 void NearbyTriangles(const CollisionMesh& m,const GeometricPrimitive3D& g,Real d,std::vector<int>& tris,int max=INT_MAX);
174 void NearbyTriangles(const CollisionMesh& m1,const CollisionMesh& m2,Real d,std::vector<int>& tris1,std::vector<int>& tris2,int max=INT_MAX);
175 
178 Real Distance(const CollisionMesh& m,const Vector3& p,Real bound=Inf);
184 Real Distance(const CollisionMesh& m,const Vector3& p,int& closestTri,Vector3& surfacePt,Vector3& direction,Real bound=Inf);
187 Real Distance(const CollisionMesh& m,const GeometricPrimitive3D& g,Real bound=Inf);
193 Real Distance(const CollisionMesh& m,const GeometricPrimitive3D& g,int& closestTri,Vector3& surfacePt,Vector3& direction,Real bound=Inf);
195 Real Distance(const CollisionMesh& m1,const CollisionMesh& m2,Real absErr,Real relErr,Real bound=Inf);
196 
199 int ClosestPoint(const CollisionMesh& m,const Vector3& p,Vector3& cplocal,Real bound=Inf);
200 
203 void ClosestPoints(const CollisionMesh& m1,const CollisionMesh& m2,Real absErr,Real relErr,Vector3& v1local,Vector3& v2local,Real bound=Inf);
204 
208 int ClosestPointAndNormal(const Meshing::TriMesh& m,Real pWeight,Real nWeight,const Vector3& p,const Vector3& n,Vector3& cp);
209 
215 int ClosestPointAndNormal(const CollisionMesh& mesh,Real nWeight,const Vector3& p,const Vector3& n,Vector3& cplocal);
216 
217 
218 //should eventually implement these...
219 //bool WithinDistance(const CollisionMesh& m,const Segment3D& s,Real d);
220 //bool WithinDistance(const CollisionMesh& m,const AABB3D& bb,Real d);
221 //bool WithinDistance(const CollisionMesh& m,const Box3D& b,Real d);
222 //void NearbyTriangles(const CollisionMesh& m,const Segment3D& s,Real d,std::vector<int>& tris);
224 //int ClosestPoints(const CollisionMesh& m,const Segment3D& s,Vector3& vm,Vector3& vs);
225 
226 
227 } //namespace Geometry
228 
229 #endif
void GetBB(const CollisionMesh &m, Box3D &bb)
Returns the bounding box containing m.
Definition: CollisionMesh.cpp:1856
A generic 3D geometric primitive class.
Definition: geometry3d.h:33
Real Distance(const CollisionImplicitSurface &s, const Vector3 &pt)
Definition: CollisionImplicitSurface.cpp:140
A 3D vector class.
Definition: math3d/primitives.h:136
Definition: CollisionMesh.h:102
A triangle mesh that contains connectivity relations between vertices and triangles.
Definition: TriMeshTopology.h:31
A 3D axis-aligned bounding box.
Definition: AABB3D.h:13
Definition: CollisionMesh.cpp:17
A rigid-body transformation.
Definition: math3d/primitives.h:820
A 3D sphere class.
Definition: Sphere3D.h:21
int RayCastLocal(const CollisionMesh &mesh, const Ray3D &r, Vector3 &pt)
Definition: CollisionMesh.cpp:1848
int ClosestPointAndNormal(const TriMesh &m, Real pWeight, Real nWeight, const Vector3 &p, const Vector3 &n, Vector3 &cp)
Definition: CollisionMesh.cpp:1726
Contains all the definitions in the Math3D package.
Definition: AnyGeometry.h:13
void NearbyTriangles(const CollisionMesh &m, const Vector3 &p, Real d, vector< int > &tris, int max)
Computes the triangles in m within distance d to p on m.
Definition: CollisionMesh.cpp:1544
A triangle mesh along with PQP bounding volume structures that enable fast collision and other proxim...
Definition: CollisionMesh.h:26
int ClosestPoint(const CollisionMesh &mesh, const Vector3 &p, Vector3 &cp, Real bound)
Definition: CollisionMesh.cpp:1309
Uses a propagation method to calculate an approximate penetration distance of mesh m1 inside m2...
Definition: PenetrationDepth.h:22
A basic triangle mesh.
Definition: TriMesh.h:41
Real RayCast(const Meshing::VolumeGrid &grid, const Ray3D &ray, Real levelSet, Real tmax)
Definition: CollisionImplicitSurface.cpp:527
void CollideAll(const CollisionMesh &m, const Sphere3D &s, vector< int > &tris, int max)
Computes a list of triangles that overlap the geometry.
Definition: CollisionMesh.cpp:1459
A general-purpose distance querying class.
Definition: CollisionMesh.h:53
A 3D boxThe box is the unit cube [0,1]^3 set in the scaled local coordinate system. That is, one corner is at the origin, and it has dimensions [dims.x,dims.y,dims.z] in the coordinates given by {xbasis,ybasis,zbasis}.
Definition: Box3D.h:21
Contains all definitions in the Geometry package.
Definition: AnyGeometry.cpp:26
Definition: Segment3D.h:12
Definition: Ray3D.h:8