Box2D形状通过世界

问题描述:

我有Box2D这个非常奇怪的问题(在iOS下)。我有一个搁在屏幕底部的身体。如果我使用body->SetType(b2_staticBody)将body从b2_dynamicBody设置为b2_staticBody,然后将其设置回b2_dynamicBody,它会在屏幕底部快速移动(在看到它向下移动的几帧内),然后再通过地板,并正确地休息。Box2D形状通过世界

这种行为似乎只发生在屏幕的底部。与其他坐在一起的身体做同样的事情不会产生这种行为。

我定义屏幕边缘如下(screenRect如已经被调整到世界的空间):

b2BodyDef groundBodyDef; 
groundBodyDef.position.Set(0,0); 
b2Body* groundBody = globalWorld->CreateBody(&groundBodyDef); 
b2PolygonShape groundBox; 
b2FixtureDef boxShapeDef; 
boxShapeDef.shape = &groundBox; 
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p1.y), b2Vec2(screenRect.p2.x,  screenRect.p1.y)); 
groundBody->CreateFixture(&boxShapeDef); 
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p1.y), b2Vec2(screenRect.p1.x, screenRect.p2.y)); 
groundBody->CreateFixture(&boxShapeDef); 
groundBox.SetAsEdge(b2Vec2(screenRect.p1.x,screenRect.p2.y), b2Vec2(screenRect.p2.x, screenRect.p2.y)); 
groundBody->CreateFixture(&boxShapeDef); 
groundBox.SetAsEdge(b2Vec2(screenRect.p2.x,screenRect.p2.y), b2Vec2(screenRect.p2.x,  screenRect.p1.y)); 
groundBody->CreateFixture(&boxShapeDef); 

这样做的最奇怪的部分是多个I切换体从动态到静态,越远和在被推回去之前,它落在地板上更远。

除了从动态到静态,我没有改变体内的其他任何东西。如果我移动身体并将其放回地板上,开始将它从动态切换到静态,它将重置掉落到地板上的多少,但是它会在我切换时再次累积。

我不明白为什么会像这样掉下地板,除非我错误地创建它。游戏中的其他一切都很完美。

我也有这个问题。这是我的理论:当对象是静态的时,它会停止与其他静态东西(如地面)产生联系。所以,似乎再次设置为动态时,它无法更新此联系人检查。

我的解决方案是这样的:由于更改对象的位置正确更新这些联系人,我只是将对象移动到当前位置。不幸的是,它被检测为零变化。所以,我需要将它移动到其他地方,然后再移动到之前的位置。

b2Vec2 pos = body.getPosition(); 
float ang = body.getAngle(); 
b2Vec2 off_map(-100,-100); 
body.setPositionAndAngle(off_map, 0); 
body.setPositionAndAngle(pos, ang); 

如果您还没有关闭,地图区域,可以尝试先动期间停用的对象。