2011-07-11 20 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の既知の問題です。静的なボディやループの形状に1つの大きなポリゴンを使うか、動的なボディの角をベベルにして完全に正方形にならないようにすることで、改善することができます。

+0

情報をありがとう!形状の数が多いとパフォーマンスとメモリに影響がありますか?そして、あなたはどういう意味ですか:「ダイナミックボディの角を斜めにして、完全に正方形ではない」 – Sixva

+0

より多くのメモリを使用してパフォーマンスに影響を与えますが、Box2Dの衝突検出ルーチンはかなり良いので、平均的なPCを心配するには何千もの人がいる必要があります。ベベルとはコーナーから少し外して正方形ではないことを意味します。正方形を8角形にします。それはそれが固執する広場だからです。 – 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); 
関連する問題