我正在使用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中使用这些掩码:
-> -它不会在循环中进行任何迭代。(我不想要)
-> +碰撞对rigidBody没有影响(我确实想要)
不使用任何掩码:
-> +它正在对冲突进行迭代(我确实想要)
-> -冲突会影响rigidBody (我不想要)
它看起来像是碰撞的掩码逻辑影响了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;
}但它真的很大。
发布于 2020-09-09 23:31:18
这里已经回答了:Ghost objects - bulletphysics这一行:
level_sensor->setCollisionFlags(btCollisionObject::CF_NO_CONTACT_RESPONSE);失踪了
https://stackoverflow.com/questions/63812469
复制相似问题