问题描述
我正在使用子弹来管理我的任何物理问题。
现在我正在尝试做类似“传感器”的事情,目标很容易,其他物体正在一起进行碰撞和运动,并且我希望能够在物体到达特定区域时发送信号。 / 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);
丢失了