Box2Dボディのバウンディングボックスを取得


12

Box2Dでは、すでに世界で作成されたボディのバウンディングボックスを取得できるかどうか興味がありました。

したがって、基本的には、ボディは作成され、世界などと対話します。そして、そのBodyのバウンディングボックスが必要でした。出来ますか?

回答:


11

Box2Dでは、ボディには関連付けられたバウンディングボックスがありませんが、フィクスチャにはあります。したがって、すべてのフィクスチャを反復処理して、新しいAABBを生成する必要があります。このようなもの:

b2AABB aabb;
aabb.lowerBound = b2Vec2(FLT_MAX,FLT_MAX);
aabb.upperBound = b2Vec2(-FLT_MAX,-FLT_MAX); 
b2Fixture* fixture = body->GetFixtureList();
while (fixture != NULL)
{
    aabb.Combine(aabb, fixture->GetAABB());
    fixture = fixture->GetNext();
}

1
これは本当に正しいですか。私が使用しているbox2dには、fixture->GetAABB()存在しませんが、存在fixture->GetAABB(int32 childIndex)します。
ジョニー

上限と下限は、左上の角と右下の角ですか?
jokoon

1

フィクスチャaabbを使用すると、シェイプの半径も含まれます。シェイプの半径なしで実際のaabbを取得する場合は、次のようにします。

b2AABB aabb;
b2Transform t;
t.SetIdentity();
aabb.lowerBound = b2Vec2(FLT_MAX,FLT_MAX);
aabb.upperBound = b2Vec2(-FLT_MAX,-FLT_MAX); 
b2Fixture* fixture = body->GetFixtureList();
while (fixture != nullptr) {
     const b2Shape *shape = fixture->GetShape();
     const int childCount = shape->GetChildCount();
     for (int child = 0; child < childCount; ++child) {
            const b2Vec2 r(shape->m_radius, shape->m_radius);
            b2AABB shapeAABB;
            shape->ComputeAABB(&shapeAABB, t, child);
            shapeAABB.lowerBound = shapeAABB.lowerBound + r;
            shapeAABB.upperBound = shapeAABB.upperBound - r;
            aabb.Combine(shapeAABB);
    }
    fixture = fixture->GetNext();
}

なぜ形状半径を取得したくないのですか?私はもともと、この回答からソースをコピーし、それは他の答えよりも徹底した考えが、今私はそれが私の場合のために正しくないのですが、このコードはで使用されるべきシナリオ好奇心だということを発見しました。
ミッチ

ただし、これは新しいBox2D APIを使用していることがわかります。それがこの答えを好む理由の1つです。ただし、上記で言及したことに関連して、コメントアウトしshapeAABB.lowerBound = shapeAABB.lowerBound + r;shapeAABB.upperBound = shapeAABB.upperBound - r;必要な動作を取得する必要がありました。
ミッチ

0

実際、通常はforループの方が反復には適しています。@noelの答えを取る:

b2AABB aabb;
aabb.lowerBound = b2Vec2(FLT_MAX,FLT_MAX);
aabb.upperBound = b2Vec2(-FLT_MAX,-FLT_MAX); 
for (b2Fixture* fixture = body->GetFixtureList(); fixture; fixture = fixture->GetNext())
{
    aabb.Combine(aabb, fixture->GetAABB());
}

fixtureブール値とみなされる式は、私が理解すると、と同等fixture != NULLです。


0

これは私が一般的に使用するものです:

Rect aabb = someNode->getBoundingBox();
DrawNode* drawNode = DrawNode::create();
drawNode->drawRect(aabb.origin, aabb.origin + aabb.size, Color4F(1, 0, 0, 1));
this->addChild(drawNode, 100);

これは親ノードです。これをノード自体(例:someNode)に追加しましたが、これも機能しているようです。z-indexが十分に高いことを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.