物理子弹-任何“鬼魂”尸体?

问题描述

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

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

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

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

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

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

不使用任何面具:

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

->-碰撞影响了bodyBody(我不想要)

看起来好像碰撞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);

丢失了

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...