这是本文档旧的修订版!
btVector3 aabbMin,aabbMax; colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(),aabbMin,aabbMax); btSingleContactCallback contactCB(colObj,this,resultCallback); m_broadphasePairCache->aabbTest(aabbMin,aabbMax,contactCB);//底层是层次包围盒
virtual bool process(const btBroadphaseProxy* proxy) { btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject; if (collisionObject == m_collisionObject) return true; //only perform raycast if filterMask matches if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) { btCollisionObjectWrapper ob0(0,m_collisionObject->getCollisionShape(),m_collisionObject,m_collisionObject->getWorldTransform(),-1,-1); btCollisionObjectWrapper ob1(0,collisionObject->getCollisionShape(),collisionObject,collisionObject->getWorldTransform(),-1,-1);//获取形状 btCollisionAlgorithm* algorithm = m_world->getDispatcher()->findAlgorithm(&ob0,&ob1,0, BT_CLOSEST_POINT_ALGORITHMS);//查找针对这两个形状的精确碰撞接口 if (algorithm) { btBridgedManifoldResult contactPointResult(&ob0,&ob1, m_resultCallback); //discrete collision detection query algorithm->processCollision(&ob0,&ob1, m_world->getDispatchInfo(),&contactPointResult);//调用接口 algorithm->~btCollisionAlgorithm(); m_world->getDispatcher()->freeCollisionAlgorithm(algorithm); } } return true; }