I am new to bullet, and i wish to test for collision between a number of static models in my environment.
I load multiple models and i use the code below to detect collision but for some reason when i test for the 'number of manifolds' its always zero even though the models are colliding.
Am i missing something?
Your help is very much appreciated.
Please find the code below
Code: Select all
void bt_collides_arbitrary_mesh(bool& collision,float& pen_depth,vector<Model> m)
{
btCollisionConfiguration* bt_collision_configuration;
btCollisionDispatcher* bt_dispatcher;
btAxisSweep3* bt_broadphase;
btCollisionWorld* bt_collision_world;
double scene_size = 500;
unsigned int max_objects = 10000;
bt_collision_configuration = new btDefaultCollisionConfiguration();
bt_dispatcher = new btCollisionDispatcher(bt_collision_configuration);
btScalar sscene_size = (btScalar) scene_size;
btVector3 worldAabbMin(-sscene_size, -sscene_size, -sscene_size);
btVector3 worldAabbMax(sscene_size, sscene_size, sscene_size);
bt_broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, max_objects,0,true);
bt_collision_world = new btCollisionWorld(bt_dispatcher, bt_broadphase, bt_collision_configuration);
//Create multiple collision objects
vector<btCollisionObject*> M;
vector<btTriangleMeshShape*> mM;
vector<btTriangleMesh*> TIVA;
btCollisionObject* tM;
btTriangleMeshShape* tmM;
btTriangleMesh* tTIVA;
//Move each to a specific location
btMatrix3x3 basis;
basis.setIdentity();
int counter=0;
for(int i=0;i<m.size();i++)
{
M.push_back(tM);
mM.push_back(tmM);
TIVA.push_back(tTIVA);
//read faces
TIVA[counter]=new btTriangleMesh();
for(int k=0;k<m[i].f.size();k++)
{
btVector3 v0(m[i].v[m[i].f[k].a-1].x,m[i].v[m[i].f[k].a-1].y,m[i].v[m[i].f[k].a-1].z);
btVector3 v1(m[i].v[m[i].f[k].b-1].x,m[i].v[m[i].f[k].b-1].y,m[i].v[m[i].f[k].b-1].z);
btVector3 v2(m[i].v[m[i].f[k].c-1].x,m[i].v[m[i].f[k].c-1].y,m[i].v[m[i].f[k].c-1].z);
TIVA[counter]->addTriangle(v0,v1,v2);
}
//set up mesh shape
mM[counter]=new btBvhTriangleMeshShape(TIVA[counter],true);
mM[counter]->setMargin(0.f);
//set up collision shape
M[counter]=new btCollisionObject();
M[counter]->getWorldTransform().setBasis(basis);
M[counter]->setCollisionShape(mM[counter]);
bt_collision_world->addCollisionObject(M[counter]);
counter++;
}
//Perform collision detection
bt_collision_world->performDiscreteCollisionDetection();
int numManifolds = bt_collision_world->getDispatcher()->getNumManifolds();
//For each contact manifold
if(numManifolds>0)
collision=true;
pen_depth=0;
for (int i = 0; i < numManifolds; i++)
{
btPersistentManifold* contactManifold = bt_collision_world->getDispatcher()->getManifoldByIndexInternal(i);
btCollisionObject* obA = const_cast<btCollisionObject*>(contactManifold->getBody0());
btCollisionObject* obB = const_cast<btCollisionObject*>(contactManifold->getBody1());
contactManifold->refreshContactPoints(obA->getWorldTransform(), obB->getWorldTransform());
int numContacts = contactManifold->getNumContacts();
//For each contact point in that manifold
for (int j = 0; j < numContacts; j++)
{
//Get the contact information
btManifoldPoint& pt = contactManifold->getContactPoint(j);
btVector3 ptA = pt.getPositionWorldOnA();
btVector3 ptB = pt.getPositionWorldOnB();
double ptdist = pt.getDistance();
btVector3 normal_nB=pt.m_normalWorldOnB;
if(ptdist<0)
{
if(abs(ptdist)>pen_depth)
pen_depth=abs(ptdist);
}
}
}
//clean up
for(int i=0;i<counter;i++)
{
bt_collision_world->removeCollisionObject(M[i]);
delete M[i];
delete mM[i];
}
delete bt_collision_world;
delete bt_collision_configuration;
delete bt_dispatcher;
delete bt_broadphase;
}