Collision notification
-
- Posts: 59
- Joined: Thu Aug 31, 2006 11:51 am
Collision notification
Is there an ability to get notification (callback) when collision with particular object occurs?
-
- Site Admin
- Posts: 4221
- Joined: Sun Jun 26, 2005 6:43 pm
- Location: California, USA
Re: Collision notification
It depends what you want to do with this:Jack wrote:Is there an ability to get notification (callback) when collision with particular object occurs?
If you only want to know the contacts/bodies overlapping with a certain body, you can use the btDynamicsWorld (btCollisionWorld) and iterate over all contact points (btPersistentManifolds) and intercept the objects that you are interested in, and check wether there are at least one contact point. The details are in CollisionInterfaceDemo:
Code: Select all
int numManifolds = collisionWorld->getDispatcher()->getNumManifolds();
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());
contactManifold->refreshContactPoints(obA->m_worldTransform,obB->m_worldTransform);
int numContacts = contactManifold->getNumContacts();
for (int j=0;j<numContacts;j++)
{
btManifoldPoint& pt = contactManifold->getContactPoint(j);
glBegin(GL_LINES);
glColor3f(1, 0, 1);
btVector3 ptA = pt.getPositionWorldOnA();
btVector3 ptB = pt.getPositionWorldOnB();
glVertex3d(ptA.x(),ptA.y(),ptA.z());
glVertex3d(ptB.x(),ptB.y(),ptB.z());
glEnd();
}
//you can un-comment out this line, and then all points are removed
//contactManifold->clearManifold();
}
If you want to modify the friction/restitution of the contact points with that particular object, you can do that by enabling the CF_CUSTOM_MATERIAL_CALLBACK for the rigidbody, see ConcavePhysicsDemo for details:
Code: Select all
staticBody->m_collisionFlags |= btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK;
Thanks,
Erwin