回答:
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
です。
fixture->GetAABB()
存在しませんが、存在fixture->GetAABB(int32 childIndex)
します。