Is there something I"m missing when using triangle shapes as opposed to using convex shapes?
Here is the code that I'm using:
Initializing bullet
Code: Select all
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
btVector3 worldAabbMin(-20000,-20000,-20000);
btVector3 worldAabbMax(20000,20000,20000);
btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax);
collisionWorld = new btCollisionWorld(dispatcher,broadphase,collisionConfiguration);
Code: Select all
BtOgre::StaticMeshToShapeConverter converter(entity);
btBvhTriangleMeshShape* shapeTMP=converter.createTrimesh();
btMatrix3x3 basisA;
basisA.setIdentity();
newBody.btColObj = new btCollisionObject;
newBody.btColObj->getWorldTransform().setBasis(basisA);
newBody.btColObj->setCollisionShape(shapeTMP);
collisionWorld->addCollisionObject(newBody.btColObj);
//Initial position
newBody.btColObj->getWorldTransform().setOrigin(btVector3(newBody.prevPos.x, newBody.prevPos.y, newBody.prevPos.z));
Testing for collisions
Code: Select all
if (collisionWorld)
collisionWorld->performDiscreteCollisionDetection();
int numManifolds = collisionWorld->getDispatcher()->getNumManifolds();
int i;
for (i=0;i<numManifolds;i++)
{
btPersistentManifold* contactManifold = collisionWorld->getDispatcher()->getManifoldByIndexInternal(i);
btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
Ogre::Entity *a=static_cast<Ogre::Entity*>(obA->getUserPointer());
Ogre::Entity *b=static_cast<Ogre::Entity*>(obB->getUserPointer());
int mover = findBody(a); //Need to get the previous position, entities and scene nodes
int hit = findBody(b); //Need to get the previous position, entities and scene nodes
//This gets collisions to be much closer
/* Check all contacts points */
int numContacts = contactManifold->getNumContacts();
for (int j=0;j<numContacts;j++)
{
btManifoldPoint& pt = contactManifold->getContactPoint(j);
if (pt.getDistance()<0.f)
{
collision(timeSinceLastFrame, mover, a, hit, b);
break;
}
}
}