Bullet物理引擎的宽相过滤回调:用于在复合体内筛选单个形状。

5
有没有一种方法可以按照以下方式在Bullet Physics中设置Broadphase Filter Callback:
由两个形状组成的复合动态物体,比如一个圆柱和一个长方体,其中圆柱只能与其他动态物体内部的圆柱相碰撞,而长方体只能与第三类静态球体发生碰撞。
不允许发生其他碰撞:圆柱与球体不得发生碰撞;长方体之间也不得发生碰撞。
下图显示了上述内容: collision-filter
1个回答

3
你可以做到。这是代码。
struct FilterCallback : public btOverlapFilterCallback 
{ 
    virtual bool  needBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const; 
}; 
// ....
FilterCallback filterCallback;
// ....
m_dynamicsWorld->getPairCache()->setOverlapFilterCallback(filterCallback);

bool  FilterCallback::needBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const 
{ 
// return false for pair with no colision
}

你知道我是否可以在复合体内的形状中检索userData指针,就像这样:btCollisionObject * collisionObject =(btCollisionObject *)proxy0->m_clientObject; customData * userData =(customData *)collisionObject->getUserPointer(); - rraallvv
我认为这是Broadphase本身的限制。 - rraallvv
你可以有两个刚体,并且通过在每一帧应用力的方式使它们不发生碰撞并保持在一起。 - Max
可以使用一些约束条件,但那可能是一个软连接,不像连接复合形状的关节... 我会尝试两种方法,看看效果如何。 - rraallvv
您可以将userPointer添加到形状中,并从复合形状中检索它。myChildShape->setUserPointer() ..... myChildShape->getUserPointer() - Benoît Lahoz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接