box2d:禁用碰撞时弹跳

时间:2010-10-06 08:28:32

标签: iphone box2d-iphone

我有一些盒子,使用box2d创建,恢复原状设置为零。但是当它们掉落时 相互之间出现反弹事件。但是我不希望这样......我希望它们不会在落在另一个上时移动。如果我关闭重力就可以完成。但我也想要重力。我的代码是

UIImage *imageOfSnowV1 = [ UIImage imageNamed:[NSString stringWithFormat:@"Object%d.png",currentlySelected]];
    CCTexture2D  *texOfSnowV1 = [[ [CCTexture2D alloc] initWithImage:imageOfSnowV1 ] autorelease];
    CCSprite *sprite = [CCSprite spriteWithTexture:texOfSnowV1  rect:CGRectMake(0, 0, 32, 32)];
    [self addChild:sprite];
    sprite.position = ccp(p.x, p.y);
    sprite.tag=[temp intValue];


    // Define the dynamic body.
    //Set up a 1m squared box in the physics world

    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;

    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
    bodyDef.userData = sprite;
    b2Body *bodyS = world->CreateBody(&bodyDef);

    // Define another box shape for our dynamic body.

    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box




    b2MassData massData;
    massData.mass = 0.1f;
        bodyS->SetMassData(&massData);


    // Define the dynamic body fixture.
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox; 
    fixtureDef.density = 50.0f;
    fixtureDef.restitution=0.0f;
    fixtureDef.friction = 0.01f;


    bodyS->CreateFixture(&fixtureDef);

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

我记得box2d默认情况下使用碰撞对象的最大恢复原理,所以即使静态体具有任何大于0的动态体恢复设置为0,那么恢复将用于碰撞,你可以修改b2MixRestitution函数满足您的需求。

干杯, KrzysztofZabłocki

答案 1 :(得分:0)

我最近遇到了同样的问题。我的解决方案,当你在联系人监听器中检测到新的碰撞时,只需将Y坐标清零。它在这里做得非常好。

答案 2 :(得分:0)

你必须增加velocityIterations和positionIterations。如果身体很快,它们会重叠。所以你需要更好的计算。取决于身体数量你可能会遇到性能问题,只需要使用这个值。

int32 velocityIterations = 10;
int32 positionIterations = 8;
world->Step( timeStep, velocityIterations, positionIterations );