void ModelPhysics::near_callback(btBroadphasePair & collisionPair, btCollisionDispatcher & dispatcher, const btDispatcherInfo & dispatchInfo) { ModelBody * pBody0 = static_cast<ModelBody*>(collisionPair.m_pProxy0->m_clientObject); ModelBody * pBody1 = static_cast<ModelBody*>(collisionPair.m_pProxy1->m_clientObject); dispatcher.defaultNearCallback(collisionPair, dispatcher, dispatchInfo); }
static void MyNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo) { const btBroadphaseProxy* proxy = s_LastHeldBody ? s_LastHeldBody->getBroadphaseProxy(): NULL; if (collisionPair.m_pProxy0 == proxy || collisionPair.m_pProxy1 == proxy) { // cancel collision return; } // Do your collision logic here // Only dispatch the Bullet collision information if you want the physics to continue dispatcher.defaultNearCallback(collisionPair, dispatcher, dispatchInfo); }
void near_callback( btBroadphasePair &btbroadphasepair, btCollisionDispatcher &btdispatcher, const btDispatcherInfo &btdispatcherinfo ) { if( ( player->btrigidbody == btbroadphasepair.m_pProxy0->m_clientObject || player->btrigidbody == btbroadphasepair.m_pProxy1->m_clientObject ) && ( enemy->btrigidbody == btbroadphasepair.m_pProxy0->m_clientObject || enemy->btrigidbody == btbroadphasepair.m_pProxy1->m_clientObject ) ) { game_over = 1; } btdispatcher.defaultNearCallback( btbroadphasepair, btdispatcher, btdispatcherinfo ); }
//вызываеться при столкновении геометрий void PhysicsManager::mNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo) { btCollisionObject* colObj0 = static_cast<btCollisionObject*>(collisionPair.m_pProxy0->m_clientObject); btCollisionObject* colObj1 = static_cast<btCollisionObject*>(collisionPair.m_pProxy1->m_clientObject); if(dispatcher.needsCollision(colObj0,colObj1)) { btCollisionObjectWrapper obj0Wrap(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform()); btCollisionObjectWrapper obj1Wrap(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform()); //dispatcher will keep algorithms persistent in the collision pair if (!collisionPair.m_algorithm) { collisionPair.m_algorithm = dispatcher.findAlgorithm(&obj0Wrap,&obj1Wrap); } if (collisionPair.m_algorithm) { btManifoldResult contactPointResult(&obj0Wrap,&obj1Wrap); if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE) { //discrete collision detection query collisionPair.m_algorithm->processCollision(&obj0Wrap,&obj1Wrap,dispatchInfo,&contactPointResult); } else { //continuous collision detection query, time of impact (toi) btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult); if (dispatchInfo.m_timeOfImpact > toi) { dispatchInfo.m_timeOfImpact = toi; } } if (contactPointResult.getPersistentManifold()->getNumContacts()>0) //только сдесь мы уверены что есть пересечения { GameLogic::getSingletonPtr()->CollideBody(colObj0, colObj1); } } } dispatcher.defaultNearCallback(collisionPair, dispatcher, dispatchInfo); }