Динамическое тело Box2d застряло на статическом - PullRequest
2 голосов
/ 11 июля 2011

Иногда, когда динамическое тело движется и сталкивается со статическим телом, динамически застревает и останавливается.

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.

Как убрать застревание?

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Если вы видите, как динамический бокс зацепился за плитки в статическом теле, как это видно на скриншоте, это известная проблема в Box2D на данный момент.Вы можете улучшить его, используя один большой многоугольник для статического тела, или форму петли, или просто наклонить углы динамического тела, чтобы они не были идеально квадратными.

0 голосов
/ 12 июля 2011

Решение: использовать ребра для создания крепежа (на динамических и статических телах)

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

instead

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