2

我有一些盒子,使用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);

谁能帮我?

4

3 回答 3

0

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

int32 velocityIterations = 10;
int32 positionIterations = 8;
world->Step( timeStep, velocityIterations, positionIterations ); 
于 2013-01-04T11:40:04.490 回答
0

我最近也遇到了同样的问题。我的解决方案是,当您在联系侦听器中检测到新的碰撞时,只需将 Y 坐标归零。它在这里完美地发挥了作用。

于 2011-10-16T17:06:08.840 回答
0

我记得box2d默认使用碰撞对象的最大恢复,所以即使你将动态体恢复设置为0,如果静态体大于0,那么恢复将用于碰撞,你可以修改b2MixRestitution函数以满足你的需要.

干杯, Krzysztof Zabłocki

于 2010-10-06T08:50:51.847 回答