KrisLibrary  1.0.0
AnyGeometry.h
1 #ifndef ANY_GEOMETRY_H
2 #define ANY_GEOMETRY_H
3 
4 #include <KrisLibrary/utils/AnyValue.h>
5 #include "CollisionMesh.h"
6 #include "ConvexHull3D.h"
7 
8 class TiXmlElement;
9 
10 //forward declarations
11 namespace Meshing { template <class T> class VolumeGridTemplate; typedef VolumeGridTemplate<Real> VolumeGrid; class PointCloud3D; }
12 namespace Geometry { class CollisionPointCloud; class CollisionImplicitSurface; class ConvexHull3D; class CollisionConvexHull3D; }
13 namespace Math3D { class GeometricPrimitive3D; }
14 namespace GLDraw { class GeometryAppearance; }
15 
16 namespace Geometry {
17 
18  using namespace Math3D;
19  using namespace std;
20 
21 class AnyDistanceQuerySettings;
22 class AnyDistanceQueryResult;
23 class AnyContactsQuerySettings;
24 class AnyContactsQueryResult;
25 
38 {
39  public:
48  enum Type { Primitive, TriangleMesh, PointCloud, ImplicitSurface, ConvexHull, Group };
49 
50  AnyGeometry3D();
51  AnyGeometry3D(const GeometricPrimitive3D& primitive);
53  AnyGeometry3D(const Meshing::TriMesh& mesh);
55  AnyGeometry3D(const vector<AnyGeometry3D>& items);
56  AnyGeometry3D(const ConvexHull3D& cvxhull);
57  AnyGeometry3D(const AnyGeometry3D& geom) = default;
58  AnyGeometry3D(AnyGeometry3D&& geom) = default;
59  AnyGeometry3D& operator = (const AnyGeometry3D& rhs) = default;
60  AnyGeometry3D& operator = (AnyGeometry3D&& rhs) = default;
61  static const char* TypeName(Type type);
62  const char* TypeName() const { return AnyGeometry3D::TypeName(type); }
63  const GeometricPrimitive3D& AsPrimitive() const;
64  const Meshing::TriMesh& AsTriangleMesh() const;
65  const Meshing::PointCloud3D& AsPointCloud() const;
66  const Meshing::VolumeGrid& AsImplicitSurface() const;
67  const ConvexHull3D& AsConvexHull() const;
68  const vector<AnyGeometry3D>& AsGroup() const;
69  GeometricPrimitive3D& AsPrimitive();
70  Meshing::TriMesh& AsTriangleMesh();
71  Meshing::PointCloud3D& AsPointCloud();
72  Meshing::VolumeGrid& AsImplicitSurface();
73  ConvexHull3D& AsConvexHull();
74  vector<AnyGeometry3D>& AsGroup();
75  GLDraw::GeometryAppearance* TriangleMeshAppearanceData();
76  const GLDraw::GeometryAppearance* TriangleMeshAppearanceData() const;
77  static bool CanLoadExt(const char* ext);
78  static bool CanSaveExt(const char* ext);
79  bool Load(const char* fn);
80  bool Save(const char* fn) const;
81  bool Load(istream& in);
82  bool Save(ostream& out) const;
83  bool Load(TiXmlElement* in);
84  bool Save(TiXmlElement* out) const;
85  bool Empty() const;
86  size_t NumElements() const;
87  GeometricPrimitive3D GetElement(int elem) const;
88  AABB3D GetAABB() const;
89  void Transform(const RigidTransform& T);
90  void Transform(const Matrix4& mat);
91  void Merge(const vector<AnyGeometry3D>& geoms);
92  bool Convert(Type restype,AnyGeometry3D& res,double param=0) const;
93 
94  Type type;
99 };
100 
101 
113 {
114  public:
121  AnyCollisionGeometry3D(const ConvexHull3D& primitive);
122  AnyCollisionGeometry3D(const vector<AnyGeometry3D>& group);
125  AnyCollisionGeometry3D& operator = (const AnyCollisionGeometry3D& rhs);
126  AnyCollisionGeometry3D& operator = (AnyCollisionGeometry3D&& rhs) = default;
130  void InitCollisionData();
133  void ReinitCollisionData();
135  bool CollisionDataInitialized() const { return !collisionData.empty(); }
137  void ClearCollisionData() { collisionData = AnyValue(); }
138  const RigidTransform& PrimitiveCollisionData() const;
139  const CollisionMesh& TriangleMeshCollisionData() const;
140  const CollisionPointCloud& PointCloudCollisionData() const;
141  const CollisionImplicitSurface& ImplicitSurfaceCollisionData() const;
142  const CollisionConvexHull3D& ConvexHullCollisionData() const;
143  const vector<AnyCollisionGeometry3D>& GroupCollisionData() const;
144  RigidTransform& PrimitiveCollisionData();
145  CollisionMesh& TriangleMeshCollisionData();
146  CollisionPointCloud& PointCloudCollisionData();
147  CollisionImplicitSurface& ImplicitSurfaceCollisionData();
148  CollisionConvexHull3D& ConvexHullCollisionData();
149  vector<AnyCollisionGeometry3D>& GroupCollisionData();
152  bool Convert(Type restype,AnyCollisionGeometry3D& res,double param=0);
159  AABB3D GetAABB() const;
164  Box3D GetBB() const;
167  AABB3D GetAABBTight() const;
169  RigidTransform GetTransform() const;
174  void SetTransform(const RigidTransform& T);
175  //Computes the furthest point on the geometry in the direction dir
176  //TODO: is this useful to implement outside of ConvexHull types?
177  // Vector3 FindSupport(const Vector3& dir);
178  bool Collides(AnyCollisionGeometry3D& geom);
179  bool Collides(AnyCollisionGeometry3D& geom,vector<int>& elements1,vector<int>& elements2,size_t maxcollisions=INT_MAX);
180  Real Distance(AnyCollisionGeometry3D& geom);
181  Real Distance(const Vector3& pt);
182  AnyDistanceQueryResult Distance(const Vector3& pt,const AnyDistanceQuerySettings& settings);
184  bool WithinDistance(AnyCollisionGeometry3D& geom,Real d);
185  bool WithinDistance(AnyCollisionGeometry3D& geom,Real d,vector<int>& elements1,vector<int>& elements2,size_t maxcollisions=INT_MAX);
187  bool RayCast(const Ray3D& r,Real* distance=NULL,int* element=NULL);
188 
198  Real margin;
202 };
203 
208 {
209  public:
213 
215  bool Collide();
217  bool CollideAll();
219  bool WithinDistance(Real d);
221  bool WithinDistanceAll(Real d);
223  Real PenetrationDepth();
226  Real Distance(Real absErr,Real relErr,Real bound=Inf);
227 
228  //extracts the pairs of interacting features on a previous call to Collide[All], WithinDistance[All], PenetrationDepth, or Distance
229  void InteractingPairs(std::vector<int>& t1,std::vector<int>& t2) const;
230  //extracts the pairs of interacting points on a previous call to WithinDistance[All], PenetrationDepth, or Distance. Points are given
231  //in local frames.
232  void InteractingPoints(std::vector<Vector3>& p1,std::vector<Vector3>& p2) const;
233 
234  AnyCollisionGeometry3D *a, *b;
235 
237  std::vector<int> elements1,elements2;
238  std::vector<Vector3> points1,points2;
239 };
240 
242 {
243 public:
246  Real relErr,absErr;
249 };
250 
252 {
253 public:
256  bool hasPenetration,hasElements,hasClosestPoints,hasDirections;
258  Real d;
260  int elem1,elem2;
266  Vector3 dir1,dir2;
268  vector<int> group_elem1,group_elem2;
269 };
270 
272 {
273 public:
276  Real padding1,padding2;
278  size_t maxcontacts;
280  bool cluster;
281 };
282 
284 {
285 public:
286  struct ContactPair
287  {
289  Real depth;
295  int elem1,elem2;
298  };
299 
303  vector<ContactPair> contacts;
305  bool clustered;
306 };
307 
308 } //namespace Geometry
309 
310 #endif
void GetBB(const CollisionMesh &m, Box3D &bb)
Returns the bounding box containing m.
Definition: CollisionMesh.cpp:1856
bool CollisionDataInitialized() const
Returns true if the collision data is initialized.
Definition: AnyGeometry.h:135
A generic 3D geometric primitive class.
Definition: geometry3d.h:33
Real relErr
Allowable relative and absolute errors.
Definition: AnyGeometry.h:246
size_t maxcontacts
Maximum number of contacts queried.
Definition: AnyGeometry.h:278
Vector3 dir1
Definition: AnyGeometry.h:266
Real depth
the depth of the contact, padding included
Definition: AnyGeometry.h:289
The namespace for all classes/functions in the Meshing package.
Definition: AnyGeometry.h:11
int elem1
The elements defining the closest points on the geometries.
Definition: AnyGeometry.h:260
bool clustered
True if clustering was performed.
Definition: AnyGeometry.h:305
bool hasPenetration
flags indicating which elements are filled out
Definition: AnyGeometry.h:256
A class for coloring, texturing, and drawing meshes in OpenGL.
Definition: GeometryAppearance.h:53
A 3D vector class.
Definition: math3d/primitives.h:136
Definition: CollisionMesh.h:102
vector< ContactPair > contacts
The list of computed contact points.
Definition: AnyGeometry.h:303
AnyValue collisionData
Definition: AnyGeometry.h:196
A polymorphic container class that can contain data of any type.
Definition: AnyValue.h:25
A 3D point cloud class.
Definition: PointCloud.h:50
Definition: rayprimitives.h:132
bool unreliable
if true, the contact normal can&#39;t be estimated accurately
Definition: AnyGeometry.h:297
A 3D axis-aligned bounding box.
Definition: AABB3D.h:13
AnyValue data
The data, according to the type.
Definition: AnyGeometry.h:96
An AnyGeometry with collision detection information.
Definition: AnyGeometry.h:112
Vector3 p1
the contact points on the padded geometries of object1 and object2, in world coordinates ...
Definition: AnyGeometry.h:291
bool cluster
True if you&#39;d like to cluster the contacts into at most maxcontacts results.
Definition: AnyGeometry.h:280
Real d
The distance, with negative values indicating penetration if hasPenetration=true. Otherwise...
Definition: AnyGeometry.h:258
A rigid-body transformation.
Definition: math3d/primitives.h:820
A 4x4 matrix class.
Definition: math3d/primitives.h:626
Definition: AnyGeometry.h:251
Definition: AnyGeometry.h:271
Contains all the definitions in the Math3D package.
Definition: AnyGeometry.h:13
A triangle mesh along with PQP bounding volume structures that enable fast collision and other proxim...
Definition: CollisionMesh.h:26
Vector3 n
the outward contact normal from object 1 pointing into object 2, in world coordinates ...
Definition: AnyGeometry.h:293
Real margin
Amount by which the underlying geometry is "fattened".
Definition: AnyGeometry.h:198
A class that stores information regarding a collision query. May be slightly faster than running indi...
Definition: AnyGeometry.h:207
Contains all definitions in the GLDraw package.
Definition: AnyGeometry.h:14
Vector3 cp1
The closest points on the two geometries, in world coordinates.
Definition: AnyGeometry.h:262
A class that stores any kind of geometry we&#39;ve defined.
Definition: AnyGeometry.h:37
Definition: AnyGeometry.h:283
RigidTransform currentTransform
Definition: AnyGeometry.h:201
Real upperBound
An upper bound on the distance, and if the two objects are farther than this distance the computation...
Definition: AnyGeometry.h:248
The collision data class for ConvexHull3D that contains the solid3 data structure moved by some rigid...
Definition: ConvexHull3D.h:124
An implicit surface (usually signed-distance function) with a fast collision detection data structure...
Definition: CollisionImplicitSurface.h:16
int elem1
the item defining the element to which this point belongs
Definition: AnyGeometry.h:295
A basic triangle mesh.
Definition: TriMesh.h:41
Type
Definition: AnyGeometry.h:48
A point cloud with a fast collision detection data structure.
Definition: CollisionPointCloud.h:20
Real RayCast(const Meshing::VolumeGrid &grid, const Ray3D &ray, Real levelSet, Real tmax)
Definition: CollisionImplicitSurface.cpp:527
3D-D convex hull routines
void ClearCollisionData()
Clears the current collision data.
Definition: AnyGeometry.h:137
vector< int > group_elem1
If the item is a group, this vector will recursively define the sub-elements.
Definition: AnyGeometry.h:268
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 3D array over an axis-aligned 3D volume, containing Real values.
Definition: AnyGeometry.h:11
A 3D convex hull class.
Definition: ConvexHull3D.h:62
Real padding1
Extra padding on the geometries, padding1 for this object and padding2 for the other other...
Definition: AnyGeometry.h:276
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
Definition: AnyGeometry.h:241
Contains all definitions in the Geometry package.
Definition: AnyGeometry.cpp:26
Definition: PropertyMap.cpp:9
AnyValue appearanceData
Optional appearance data, according to the type.
Definition: AnyGeometry.h:98
Definition: Ray3D.h:8