首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >物理子弹-任何“幽灵”身体?

物理子弹-任何“幽灵”身体?
EN

Stack Overflow用户
提问于 2020-09-09 21:12:03
回答 1查看 420关注 0票数 1

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

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

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

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

有没有人知道该怎么做?

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

添加btBroadphaseProxy::SensorTrigger不改变效果或忽略冲突

作为信息,我找到了以下链接:检测到https://pybullet.org/Bullet/phpBB3/viewtopic.php?t=7468冲突,但仍会影响RigidBody的移动

非常感谢!

编辑

现在我有这样的代码:

代码语言:javascript
复制
    /*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如下:

代码语言:javascript
复制
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中使用这些掩码:

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

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

不使用任何掩码:

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

-> -冲突会影响rigidBody (我不想要)

它看起来像是碰撞的掩码逻辑影响了A和B,或者我没有像我想要的那样迭代。

通过使用此方法:

代码语言:javascript
复制
world->getBroadphase()->getOverlappingPairCache()->setOverlapFilterCallback(filterCallback);

而不是:

代码语言:javascript
复制
world->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());

我可以在回调中这样做:

代码语言:javascript
复制
// 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;
    }

但它真的很大。

EN

回答 1

Stack Overflow用户

发布于 2020-09-09 23:31:18

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

代码语言:javascript
复制
level_sensor->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE);

失踪了

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63812469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档