2011-07-11 67 views
2

有时,当动态物体移动并碰撞静态物体时,动态卡住并停止。Box2d动态物体卡住静态

http://imageshack.us/photo/my-images/14/screenfgz.png/(顶部和底部线传感器,中心形状体)

对于运动使用mouseJoint-> SetTarget(POS);

设置: 世界

b2Vec2 gravity = b2Vec2(0.f, 0.f); 
bool doSleep = true; 
world = new b2World(gravity, doSleep); 
world->SetContinuousPhysics(false); // when using true, dynamic tunneling through other bodies 

动感的车身

... 
density = 1.f; 
friction = 0.f; 
restitution = 0.f; 
... 
body->SetBullet(true); 
body->SetFixedRotation(true); 

MouseJoint

b2Vec2 locationWorld = b2Vec2(pos.x/PTM_RATIO,pos.y/PTM_RATIO); 
    b2MouseJointDef md;     
    md.bodyA = groundBody; 
    md.bodyB = body; 
    md.target = body->GetPosition(); 
    md.collideConnected = true; 
    md.maxForce = 1000 * body->GetMass(); 
    md.dampingRatio = 0.1f; 
    md.frequencyHz = 2.f; 
    mouseJoint = (b2MouseJoint *)world->CreateJoint(&md); 

动态和静态物体是矩形。旋转= 0。

如何去除瑕疵?

回答

1

如果您看到动态框从屏幕截图中看到静态贴图中的贴图,这是Box2D中的一个已知问题。你可以通过对静态物体使用一个大的多边形或者循环形状来改善它,或者简单地倒角动态物体的角落,使它们不是完全正方形的。

+0

感谢您的信息!大量形状对性能和记忆有影响吗?你是什​​么意思:“简单地斜切角度的动态身体,所以他们不完全正方形”? – Sixva

+0

更多的形状会使用更多的内存,并会影响性能,但Box2D的碰撞检测例程相当不错,所以我认为您需要有数以千计的人才能担心普通的PC。斜角意味着从角落切割一点,所以它不是方形 - 将方形变成八角形。这是因为它坚持着方形。 – iforce2d

+0

谢谢iforce2d – Sixva

0

解决方案: 用于创建夹具使用边缘(在动态和静态机构)

shape.SetAsEdge(b2Vec2(x,y),b2Vec2(x2,y2)); 
bodyWall->CreateFixture(&shapeDef); 

instead 

shape.SetAsBox(width,height, b2Vec2(x,y),angle);