【问题标题】:Physic Bullet - Any 'Ghost' Body?物理子弹 - 任何“幽灵”身体?
【发布时间】:2020-09-09 13:12:02
【问题描述】:

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

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

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

我只找到了关于 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 中使用这些掩码:

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

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

不使用任何面具:

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

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

它看起来像碰撞影响 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;
    }

但它真的很可爱......

【问题讨论】:

  • 我不知道 Bullet(除了它的名字),但我知道你的问题。在我们自己的 S/W 中,我们能够不对称地启用碰撞:即我们可以启用 A 与 B 碰撞并禁用 B 与 A 碰撞。因此,如果 A 是传感器并且 B 对象 A 将识别与 B 的碰撞但是 B 不会识别 A。(实际上,我们添加了这个功能来进行不对称碰撞检测只是为了解决这个传感器问题。)也许,这是一个搜索是否/如何可以在 Bullet 中完成的想法......
  • Ty @Scheff,我会尝试在刚体上应用碰撞遮罩过滤器
  • 我的印象是 pyBullet 是 Python 绑定子弹的标签,但这可能是错误的。 (我知道 pyQt 是 Qt 的 Python 绑定,但这可能是一个“假朋友”。) pyBullet 标签还没有描述,所以很难判断。不过,pybullet 似乎并不那么受欢迎,因此丢弃它可能不会造成任何损害。 ;-)
  • 是的,有道理,网络域是 PyBullet.org,如果你点击下载它就变成了 bulletphysic

标签: c++ collision-detection bulletphysics bullet


【解决方案1】:

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

level_sensor->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE);

不见了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多