Box2D 바디의 경계 상자 가져 오기


12

Box2D에서는 이미 세계에서 만들어진 바디의 경계 상자를 얻을 수 있는지 궁금했습니다.

기본적으로 몸은 창조되고 세상과 상호 작용합니다. 그리고 그 몸의 경계 상자가 필요했습니다. 가능합니까?

답변:


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

왼쪽 상단과 오른쪽 상단이 상한과 하한입니까?
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();
}

왜 형상 반경을 원하지 않습니까? 원래는이 답변에서 소스를 복사하여 다른 답변보다 더 철저하다고 생각했지만 이제는 내 경우에 맞지 않으며이 코드를 사용해야하는 시나리오가 궁금합니다.
Mitch

그래도 이것이 최신 Box2D API를 사용한다는 것을 알았습니다. 이것이이 답변을 선호하는 이유 중 하나입니다. 그러나, 나는 위에서 언급 한 것과 관련, 나는 주석했다 shapeAABB.lowerBound = shapeAABB.lowerBound + r;그리고 shapeAABB.upperBound = shapeAABB.upperBound - r;내가 원하는하는 동작을 얻을 수 있습니다.
Mitch

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 인덱스가 충분히 높은지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.