Box2D获取物体的边界框


12

在Box2D中,我很好奇是否有可能获得世界上已经创建的物体的边界框。

因此,基本上,人体是被创造的,它与世界等相互作用。我需要那个身体的边界框。可能吗?

Answers:


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)
Jonny

上边界和下边界是左上角和右下角吗?
2012年

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。这是选择此答案的原因之一。但是,与我上面提到的内容有关,我不得不注释掉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足够高即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.