本文整理汇总了C++中btCollisionDispatcher::needsCollision方法的典型用法代码示例。如果您正苦于以下问题:C++ btCollisionDispatcher::needsCollision方法的具体用法?C++ btCollisionDispatcher::needsCollision怎么用?C++ btCollisionDispatcher::needsCollision使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类btCollisionDispatcher
的用法示例。
在下文中一共展示了btCollisionDispatcher::needsCollision方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: nearCallback
void Uncollider::nearCallback(btBroadphasePair &collisionPair,
btCollisionDispatcher &dispatcher, const btDispatcherInfo &dispatchInfo) {
btCollisionObject *colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
btCollisionObject *colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
if (dispatcher.needsCollision(colObj0, colObj1)) {
btCollisionObjectWrapper obj0Wrap(nullptr, colObj0->getCollisionShape(),
colObj0, colObj0->getWorldTransform(), -1, -1);
btCollisionObjectWrapper obj1Wrap(nullptr, colObj1->getCollisionShape(),
colObj1, colObj1->getWorldTransform(), -1, -1);
btManifoldResult contactPointResult(&obj0Wrap, &obj1Wrap);
if (not collisionPair.m_algorithm) {
#if (BT_BULLET_VERSION >=286)
collisionPair.m_algorithm =
dispatcher.findAlgorithm(&obj0Wrap, &obj1Wrap,
contactPointResult.getPersistentManifold(),
ebtDispatcherQueryType::BT_CONTACT_POINT_ALGORITHMS);
#else
collisionPair.m_algorithm = dispatcher.findAlgorithm(&obj0Wrap, &obj1Wrap);
#endif
}
if (collisionPair.m_algorithm) {
if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE) {
collisionPair.m_algorithm->processCollision(&obj0Wrap, &obj1Wrap, dispatchInfo,
&contactPointResult);
for (int i = 0; i < contactPointResult.getPersistentManifold()->getNumContacts(); ++i) {
const btManifoldPoint &pt = contactPointResult.getPersistentManifold()->
getContactPoint(i);
const btVector3 &cp = pt.getPositionWorldOnA();
if (isPointInUncollideVolume(cp)) {
contactPointResult.getPersistentManifold()->removeContactPoint(i--);
}
}
} else {
btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0, colObj1,
dispatchInfo, &contactPointResult);
if (dispatchInfo.m_timeOfImpact > toi) {
dispatchInfo.m_timeOfImpact = toi;
}
}
}
}
}
示例2: mNearCallback
//вызываеться при столкновении геометрий
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);
}