2011-03-05 55 views
3

我試圖實現bulletphysics一個簡單的鬼對象,這是我創建的鬼對象:鬼對象 - bulletphysics

btGhostPairCallback* ghostCall = new btGhostPairCallback(); 
world->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(ghostCall); 

btGhostObject* ghostObj = new btGhostObject(); 
btCollisionShape* shape = new btBoxShape(btVector3(ofGetWidth()+1000, ofGetHeight()+1000, 50)); 
ghostObj->setCollisionShape(shape); 
btTransform trans; 
trans.setIdentity(); 
trans.setOrigin(btVector3(0,0,-500)); 
ghostObj->setWorldTransform(trans); 
ghostObj->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE); 
world->addCollisionObject(ghostObj,btBroadphaseProxy::SensorTrigger,btBroadphaseProxy::AllFilter & ~btBroadphaseProxy::SensorTrigger); 

,這是如何設法找到了碰撞:

btCollisionObject* obj = world->getCollisionObjectArray()[j]; 
btRigidBody* body = btRigidBody::upcast(obj); 

    btAlignedObjectArray < btCollisionObject* > objsInsidePairCachingGhostObject; 
    btAlignedObjectArray < btCollisionObject* >* pObjsInsideGhostObject = NULL; 
    btGhostObject* ghost = btGhostObject::upcast(obj); 

    if(ghost){ 
     objsInsidePairCachingGhostObject.resize(0); 
     pObjsInsideGhostObject = &ghost->getOverlappingPairs(); 
     cout << ghost->getNumOverlappingObjects() << endl; 

但我總是得到一個迴應,我所有的世界物體都與鬼物體發生碰撞。

任何人都可以幫助我獲得一個功能簡單的鬼物體?

感謝

回答

3

從一點點我瞭解GhostObject的,你要覆蓋其默認碰撞標誌。嘗試改變這一行

ghostObj->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE); 

到:

ghostObj->setCollisionFlags(ghostObj->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); 

HTH

1

雖然我同意碰撞標誌應通過添加新的標誌,以現有的一組標誌我想的正確設置還想指出,btBoxShape的參數是一個btVector3,它定義了該對象的半範圍。這意味着寬度,高度和長度實際上是的兩倍與這些參數一樣大。