我有一些盒子,使用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);
任何人都可以帮助我吗?
答案 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 );