3

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;

しかし、すべてのワールド オブジェクトがゴースト オブジェクトと衝突しているという応答が常に得られます。

機能的な単純なゴーストオブジェクトを取得するのを手伝ってくれる人はいますか?

ありがとう

4

2 に答える 2

4

GhostObject について私が理解していることから、デフォルトの衝突フラグをオーバーライドしています。この行を変更してみてください

ghostObj->setCollisionFlags( btCollisionObject::CF_NO_CONTACT_RESPONSE);

に:

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

HTH

于 2011-04-19T16:08:21.140 に答える