답변:
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();
}
조명기 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();
}
shapeAABB.lowerBound = shapeAABB.lowerBound + r;
그리고 shapeAABB.upperBound = shapeAABB.upperBound - r;
내가 원하는하는 동작을 얻을 수 있습니다.
실제로 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
.
이것이 내가 일반적으로 사용하는 것입니다.
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 인덱스가 충분히 높은지 확인하십시오.
fixture->GetAABB()
에는 존재하지 않지만 존재fixture->GetAABB(int32 childIndex)
하지 않습니다.