3.0rc0 PhysicsShape类里的 3个形参是位掩码函数 用的什么机制?

PhysicsBody PhysicsShape 两个类里面都有这3个函数
setCategoryBitmask(int bitmask) setContactTestBitmask(int bitmask) setCollisionBitmask(int bitmask)
设置两个物体是否碰撞, 应用的什么机制啊?

:12::6:

:12: 怎么 分别设置 两个物体的 位掩码 让其 碰撞或者 不碰撞?? 跪求啊~~

继续跪求。。
box1->getPhysicsBody()->setCategoryBitmask(0x01); // 0001
box1->getPhysicsBody()->setContactTestBitmask(0x04); // 0100
box->getPhysicsBody()->setCollisionBitmask(0x03); // 0011

  box2->getPhysicsBody()->setCategoryBitmask(0x02);    // 0010
    box2->getPhysicsBody()->setContactTestBitmask(0x08); // 1000
    box2->getPhysicsBody()->setCollisionBitmask(0x01);   // 0001

    box3->getPhysicsBody()->setCategoryBitmask(0x04);    // 0100
    box3->getPhysicsBody()->setContactTestBitmask(0x01); // 0001
    box3->getPhysicsBody()->setCollisionBitmask(0x06);   // 0110

box1 和 box2 发生碰撞, box1与box3 box 2与box3 都不发生碰撞
详细可惜看 3.0rc版本 cpp-tests:: PhysicsTest 的 PhysicsContactTest类。。
有知道的没? 给解释下 设置什么值可以碰撞/不碰撞 。。。

CategoryBitmask表示“我是谁”
ContactTestBitmask表示“在我和谁发生碰撞通知我”,是否调用我注册的回调函数。
CollisionBitmask表示”我和谁发生碰撞“,如果a->CategoryBitmask & b->CollisionBitmask等于0或者b->CategoryBitmask & a->CollisionBitmask等于0,不发生碰撞,可以看到物体穿越另一个物体。
相当于在自己注册的回调函数中添加如下代码:
bool ClassName::::onContactBegin(cocos2d::PhysicsContact& contact)
{
if ((contact.shapeA->getCategoryBitmask() & contact.shapeB->getCollisionBitmask()) == 0
|| (contact.shapeB->getCategoryBitmask() & contact.shapeA->getCollisionBitmask()) == 0)
{
return false;
}
//其它代码
return true;
}

非常感谢~~

源码:
// bitmask check
if ((shapeA->getCategoryBitmask() & shapeB->getContactTestBitmask()) == 0
|| (shapeA->getContactTestBitmask() & shapeB->getCategoryBitmask()) == 0)
{
contact.setNotificationEnable(false);
}

if (shapeA->getGroup() != 0 && shapeA->getGroup() == shapeB->getGroup())
{
    ret = shapeA->getGroup() > 0;
}
else
{
    if ((shapeA->getCategoryBitmask() & shapeB->getCollisionBitmask()) == 0
        || (shapeB->getCategoryBitmask() & shapeA->getCollisionBitmask()) == 0)
    {
        ret = false;
    }
}

搞不懂为什么要 互粉了才派发消息出来。。。