Go to the documentation of this file.
14 #include "btBulletCollisionCommon.h"
15 #include "BulletCollision/CollisionShapes/btShapeHull.h"
18 #include "HACD/hacdHACD.h"
20 #include "BulletCollision/Gimpact/btGImpactShape.h"
21 #include "BulletCollision/Gimpact/btCompoundFromGimpact.h"
43 struct ContactCallback: public btCollisionWorld::ContactResultCallback {
57 ContactCallback( boolean i):btCollisionWorld::ContactResultCallback()
78 virtual btScalar addSingleResult(btManifoldPoint& cp,
79 const btCollisionObjectWrapper* colObj0, int partId0, int index0,
80 const btCollisionObjectWrapper* colObj1, int partId1, int index1)
89 point[i]=cp.m_positionWorldOnB[i];
90 normal[i]=cp.m_normalWorldOnB[i];
101 void *InitBulletWorld( boolean cont)
103 btDefaultCollisionConfiguration *collisionConfiguration= new btDefaultCollisionConfiguration();
104 btCollisionDispatcher *dispatcher= new btCollisionDispatcher(collisionConfiguration);
106 btBroadphaseInterface *broadphase= new btDbvtBroadphase();
108 TBulletInt *b= new TBulletInt;
110 b->w= new btCollisionWorld(dispatcher,broadphase,collisionConfiguration);
116 void *DefineBulletSphere( boolean fixed, double r)
118 btSphereShape *sphere= new btSphereShape(r);
120 btCollisionObject *o= new btCollisionObject();
122 o->setCollisionShape(sphere);
125 o->setCollisionFlags(btCollisionObject::CF_STATIC_OBJECT);
130 void *DefineBulletCylinder( boolean fixed, double r, double l)
132 btCylinderShapeX *cylinder= new btCylinderShapeX(btVector3(l,r,r));
134 btCollisionObject *o= new btCollisionObject();
136 o->setCollisionShape(cylinder);
138 o->setCollisionFlags(btCollisionObject::CF_STATIC_OBJECT);
143 void *DefineBulletMesh( boolean fixed, unsigned int nv, double **v, unsigned int nf, unsigned int *nvf, unsigned int **fv)
148 btConvexHullShape *hull= new btConvexHullShape();
152 btVector3 pt(btScalar(v[i][0]),btScalar(v[i][1]),btScalar(v[i][2]));
153 hull->addPoint(pt,(i==(nv-1)));
156 btCollisionObject *o= new btCollisionObject();
160 btShapeHull *shapeHull= new btShapeHull(hull);
161 shapeHull->buildHull(0);
162 btConvexHullShape* shull= new btConvexHullShape((btScalar*)shapeHull->getVertexPointer(),shapeHull->numVertices());
166 o->setCollisionShape(shull);
170 hull->setMargin(-0.15);
171 o->setCollisionShape(hull);
175 o->setCollisionFlags(btCollisionObject::CF_STATIC_OBJECT);
183 std::vector< HACD::Vec3<HACD::Real> > points;
184 std::vector< HACD::Vec3<long> > triangles;
186 for( unsigned int i=0; i<nv; i++ )
188 HACD::Vec3<HACD::Real> vertex(HACD::Real(v[i][0]),HACD::Real(v[i][1]),HACD::Real(v[i][2]));
189 points.push_back(vertex);
192 for( unsigned int i=0;i<nf;i++)
194 for( unsigned int j=2;j<nvf[i];j++)
196 HACD::Vec3<long> triangle( long(fv[i][0]), long(fv[i][j-1]), long(fv[i][j]));
197 triangles.push_back(triangle);
202 myHACD.SetPoints(&points[0]);
203 myHACD.SetNPoints(points.size());
204 myHACD.SetTriangles(&triangles[0]);
205 myHACD.SetNTriangles(triangles.size());
206 myHACD.SetCompacityWeight(0.1);
207 myHACD.SetVolumeWeight(0.0);
211 myHACD.SetNClusters(2);
212 myHACD.SetNVerticesPerCH(100);
213 myHACD.SetConcavity(100);
214 myHACD.SetAddExtraDistPoints( false);
215 myHACD.SetAddNeighboursDistPoints( false);
216 myHACD.SetAddFacesPoints( false);
218 fprintf(stderr, "computing hacd (%u)\n",nv);fflush(stderr);
222 size_t nClusters=myHACD.GetNClusters();
224 fprintf(stderr, "computed hacd\n");fflush(stderr);
226 btCompoundShape *compound= new btCompoundShape();
230 for ( unsigned int c=0;c<nClusters;c++)
233 size_t nPoints=myHACD.GetNPointsCH(c);
234 size_t nTriangles=myHACD.GetNTrianglesCH(c);
236 btScalar *vertices= new btScalar[nPoints*3];
237 int *triangles= new int[nTriangles*3];
239 HACD::Vec3<HACD::Real> *pointsCH= new HACD::Vec3<HACD::Real>[nPoints];
240 HACD::Vec3<long> *trianglesCH= new HACD::Vec3<long>[nTriangles];
241 myHACD.GetCH(c,pointsCH,trianglesCH);
244 for( size_t v=0;v<nPoints;v++)
246 vertices[3*v]=pointsCH[v].X();
247 vertices[3*v+1]=pointsCH[v].Y();
248 vertices[3*v+2]=pointsCH[v].Z();
252 for( size_t f=0;f<nTriangles;f++)
254 triangles[3*f]=trianglesCH[f].X();
255 triangles[3*f+1]=trianglesCH[f].Y();
256 triangles[3*f+2]=trianglesCH[f].Z();
260 delete [] trianglesCH;
262 btTriangleIndexVertexArray *indexVertexArrays= new btTriangleIndexVertexArray(nTriangles,triangles,3* sizeof( int),nPoints,vertices,3* sizeof(btScalar));
263 btConvexTriangleMeshShape *convexShape= new btConvexTriangleMeshShape(indexVertexArrays);
265 compound->addChildShape(trans,convexShape);
268 btCollisionObject *o= new btCollisionObject();
270 o->setCollisionShape(compound);
272 o->setCollisionFlags(btCollisionObject::CF_STATIC_OBJECT);
277 btScalar vertex[3*nv];
278 unsigned int i,j,k,nt;
289 vertex[k++]=btScalar(v[i][j]);
304 for(j=2;j<nvf[i];j++)
306 triangle[k++]=fv[i][0];
307 triangle[k++]=fv[i][j-1];
308 triangle[k++]=fv[i][j];
312 btTriangleIndexVertexArray *indexVertexArrays= new btTriangleIndexVertexArray(nt,triangle,3* sizeof( int),nv,vertex,3* sizeof(btScalar));
313 btGImpactMeshShape *trimesh= new btGImpactMeshShape(indexVertexArrays);
315 trimesh->updateBound();
317 btCollisionShape *mesh=btCreateCompoundFromGimpactShape(trimesh,0.00001);
321 btCollisionObject *o= new btCollisionObject();
323 o->setCollisionShape(mesh);
325 o->setCollisionFlags(btCollisionObject::CF_STATIC_OBJECT);
333 boolean BulletTest( boolean info,
336 double *point, double *normal,
340 btCollisionObject *o1,*o2;
349 ContactCallback resultCB(info);
354 Error( "Using BulletTest with a non-continuous collision Bullet init");
356 o1=(btCollisionObject*)h1;
357 o2=(btCollisionObject*)h2;
359 o1->getWorldTransform().setBasis(r1);
360 o1->getWorldTransform().setOrigin(t1);
362 o2->getWorldTransform().setBasis(r2);
363 o2->getWorldTransform().setOrigin(t2);
365 bw->w->contactPairTest(o1,o2,resultCB);
367 if ((info)&&(resultCB.nc>0))
373 point[i]=resultCB.point[i];
374 normal[i]=resultCB.normal[i];
378 return(resultCB.nc>0);
385 Error( "BulletCTest not implemented yet");
389 void DeleteBulletObject( void *h)
391 btCollisionObject *o;
393 o=(btCollisionObject*)h;
398 void DeleteBulletWorld( void *cw)
void Error(const char *s) General error function.
Error and warning functions.
Headers of the C interface for the Bullet collision detection library.
|
Follow us!