c++ - 物理子弹 - 有任何 'Ghost' body 吗?

标签 c++ collision-detection bulletphysics bullet

我正在使用子弹来解决我的任何物理问题。

现在我正在尝试做类似“传感器”的事情,目标很简单,其他物体正在一起进行碰撞和运动,我希望能够在物体到达特定区域时发送信号。

问题是创建这个区域并将其添加到世界中

我只找到了有关 RigidBody 和 SoftBody 的文档,我需要类似“GhostBody”的东西,其他对象可以穿过它而不受碰撞影响,但必须检测到碰撞。

有人有想法吗?

我尝试使用addCollisionObject(ghostObject)方法,但是任何与ghostObject碰撞的物体都会受到碰撞的影响。

添加 btBroadphaseProxy::SensorTrigger 不会改变效果或只是忽略碰撞

有关信息,我找到了此链接:https://pybullet.org/Bullet/phpBB3/viewtopic.php?t=7468检测到碰撞但仍然影响 RigidBody 的运动

非常感谢!

编辑

现在我有这个代码:

    /*Rigid Body ---------------- */
    shape = new btBoxShape(btVector3(0.5f, 0.75f, 0.5f));
    btTransform transform ;
    transform.setIdentity();
    transform.setOrigin( btVector3(0.0f, 0.95f, 0.0f) );

    btVector3 localInertia(0.0f, 0.0f, 0.0f);
    btScalar mass = 0.5f ;
    if(mass)
    {
        shape->calculateLocalInertia(mass, localInertia);
    }
    motionState = new btDefaultMotionState(transform);

    btRigidBody::btRigidBodyConstructionInfo boxRigidBodyConstructionInfo(mass, motionState, shape, localInertia);

    
    body = new btRigidBody(boxRigidBodyConstructionInfo);

    body->setActivationState(DISABLE_DEACTIVATION);

    world->addRigidBody(body, btBroadphaseProxy::KinematicFilter, btBroadphaseProxy::AllFilter & ~btBroadphaseProxy::SensorTrigger);

    /*GhostObject ---------------- */
    transform.setIdentity();
    transform.setOrigin( btVector3(0.0f, 0.1f, 0.0f) );
    level_sensor = new btGhostObject();
    level_sensor->setCollisionShape(new btBoxShape(btVector3(0.5f, 0.1f, 0.5f)));
    level_sensor->setWorldTransform(transform);
    world->addCollisionObject(level_sensor,btBroadphaseProxy::SensorTrigger, btBroadphaseProxy::KinematicFilter);
    world->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); 
    world->setInternalTickCallback(motorPreTickCallback);

这是回调 motorPreTickCallback :

void motorPreTickCallback (btDynamicsWorld *world, btScalar timeStep)
{
    for(int i = 0; i < level_sensor->getNumOverlappingObjects(); i++)
    {
        btRigidBody *pRigidBody = dynamic_cast<btRigidBody *>(level_sensor->getOverlappingObject(i));
        std::cout << "Collision !!!!" << std::endl;
    }
}

通过在方法 addRigidBody 和 addCollisionObject 中使用这些 mask :

-> - 它不在循环中进行任何迭代。 (我不想)

-> + 碰撞对刚体没有影响(我确实想要)

不使用任何 mask :

-> + 它正在对碰撞进行迭代(我确实想要)

-> - 碰撞影响刚体(我不想要)

看起来碰撞的掩码逻辑会影响 A 和 B,或者我没有按照我想要的那样进行迭代。

通过使用此方法:

world->getBroadphase()->getOverlappingPairCache()->setOverlapFilterCallback(filterCallback);

而不是:

world->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());

我可以在回调中做这样的事情:

// return true when pairs need collision
    virtual bool needBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const
    {
        bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
        collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
        
        //add some additional logic here that modified 'collides'

        //if(proxy0->m_clientObject is type of sensor )
        //  Cast then sensor.method(proxy1->m_clientObject)

        //if(proxy0->m_clientObject is type of sensor )
        //  Cast then sensor.method(proxy1->m_clientObject)

        return collides;
    }

但是真的很大......

最佳答案

已经在这里回答了: Ghost objects - bulletphysics 该行:

level_sensor->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE);

失踪了

关于c++ - 物理子弹 - 有任何 'Ghost' body 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63812469/

相关文章:

c++ - 问题应用鼠标冲动

c++ - ld : symbol(s) not found for architecture

c++ - std::vector 到 GLvoid*?

c++ - 我可以在引用返回类型中返回一个指针吗?

用于碰撞检测的 C++ 双迭代器循环

Java矩形碰撞检测混淆

java - 无法理解的运行时错误

c++ - gcc 确保没有编译任何 c++ isms?

javascript - 从 D3 中的列表中删除节点并重置布局

c++ - btCompoundShape 添加了额外的形状