cd_fcl.cpp
Go to the documentation of this file.
1 
10 #if _HAVE_FCL
11 
12 #include "cd_fcl.h"
13 
14 #include "fcl/shape/geometric_shapes.h"
15 #include "fcl/traversal/traversal_node_bvhs.h"
16 #include "fcl/collision.h"
17 #include "fcl/continuous_collision.h"
18 
19 using namespace fcl;
20 
21 void *DefineFCLSphere(double r)
22 {
23  Sphere *h=new Sphere(r);
24 
25  return((void *)h);
26 }
27 
28 void *DefineFCLCylinder(double r,double l)
29 {
30  Cylinder *h=new Cylinder(r,l);
31 
32  return((void *)h);
33 }
34 
35 void *DefineFCLMesh(unsigned int nv,double **v,unsigned int nf,unsigned int *nvf,unsigned int **fv)
36 {
37  BVHModel<RSS> *h;
38  std::vector<Vec3f> vert;
39  std::vector<Triangle> triang;
40  unsigned int i,j;
41 
42  vert.clear();
43  for(i=0;i<nv;i++)
44  vert.push_back(Vec3f(v[i][0],v[i][1],v[i][2]));
45 
46  triang.clear();
47  for(i=0;i<nf;i++)
48  {
49  /* Triangulate the faces */
50  for(j=1;j<nvf[i]-1;j++)
51  triang.push_back(Triangle(fv[i][0],fv[i][j],fv[i][j+1]));
52  }
53 
54  h=new BVHModel<RSS>;
55  h->beginModel();
56  h->addSubModel(vert,triang);
57  h->endModel();
58 
59  return((void *)h);
60 }
61 
62 boolean FCLTest(boolean info,
63  void *h1,THTransform *tr1,
64  void *h2,THTransform *tr2,
65  double *point,double *normal)
66 {
67  /* request -> capture the first collision between these objects */
68  CollisionRequest request(1,true);
69  CollisionResult result;
70  Matrix3f r1(HTransformGetElement(0,0,tr1),HTransformGetElement(0,1,tr1),HTransformGetElement(0,2,tr1),
73 
74  Vec3f d1(HTransformGetElement(0,3,tr1),HTransformGetElement(1,3,tr1),HTransformGetElement(2,3,tr1));
75  Transform3f pose1(r1,d1);
76  Matrix3f r2(HTransformGetElement(0,0,tr2),HTransformGetElement(0,1,tr2),HTransformGetElement(0,2,tr2),
79  Vec3f d2(HTransformGetElement(0,3,tr2),HTransformGetElement(1,3,tr2),HTransformGetElement(2,3,tr2));
80  Transform3f pose2(r2,d2);
81  unsigned int nc;
82 
83  collide((CollisionGeometry *)h1,pose1,(CollisionGeometry *)h2,pose2,request,result);
84 
85  nc=result.numContacts();
86 
87  if ((info)&&(nc>0))
88  {
89  unsigned int k;
90  Contact c;
91 
92  /* Typically a contact is detected as a set of
93  contact points. We just get the first one.
94  We could also compute the average... */
95  c=result.getContact(0);
96  for(k=0;k<3;k++)
97  {
98  point[k]=c.pos[k];
99  normal[k]=c.normal[k];
100  }
101  }
102 
103  return(nc>0);
104 }
105 
106 boolean FCLCTest(void *h1,THTransform *tr1,THTransform *tr2,
107  void *h2,THTransform *tr3,THTransform *tr4)
108 {
109  ContinuousCollisionRequest request;
110  ContinuousCollisionResult result;
111 
112  Matrix3f r1(HTransformGetElement(0,0,tr1),HTransformGetElement(0,1,tr1),HTransformGetElement(0,2,tr1),
115  Vec3f d1(HTransformGetElement(0,3,tr1),HTransformGetElement(1,3,tr1),HTransformGetElement(2,3,tr1));
116  Transform3f pose1(r1,d1);
117  Matrix3f r2(HTransformGetElement(0,0,tr2),HTransformGetElement(0,1,tr2),HTransformGetElement(0,2,tr2),
120  Vec3f d2(HTransformGetElement(0,3,tr2),HTransformGetElement(1,3,tr2),HTransformGetElement(2,3,tr2));
121  Transform3f pose2(r2,d2);
122 
123  Matrix3f r3(HTransformGetElement(0,0,tr3),HTransformGetElement(0,1,tr3),HTransformGetElement(0,2,tr3),
126  Vec3f d3(HTransformGetElement(0,3,tr3),HTransformGetElement(1,3,tr3),HTransformGetElement(2,3,tr3));
127  Transform3f pose3(r3,d3);
128  Matrix3f r4(HTransformGetElement(0,0,tr4),HTransformGetElement(0,1,tr4),HTransformGetElement(0,2,tr4),
131  Vec3f d4(HTransformGetElement(0,3,tr4),HTransformGetElement(1,3,tr4),HTransformGetElement(2,3,tr4));
132  Transform3f pose4(r4,d4);
133 
134  continuousCollide((CollisionGeometry *)h1,pose1,pose2,(CollisionGeometry *)h2,pose3,pose4,request,result);
135 
136  return(result.is_collide);
137 }
138 
139 void DeleteFCLObject(void *h)
140 {
141  delete (CollisionGeometry *)h;
142 }
143 
144 
145 #endif
A homgeneous transform in R^3.
double HTransformGetElement(unsigned int i, unsigned int j, THTransform *t)
Gets an element in a homogeneous transform.
Definition: htransform.c:323
Headers of the C interface for the FCL collision detection library.