Box2D'de, dünyada zaten yaratılmış bir vücudun sınırlayıcı kutusunu almanın mümkün olup olmadığını merak ettim.
Temel olarak, Beden yaratılır, dünyayla ve benzerleriyle etkileşime girer. Ve vücudun sınırlayıcı kutusuna ihtiyacım vardı. Mümkün mü?
Box2D'de, dünyada zaten yaratılmış bir vücudun sınırlayıcı kutusunu almanın mümkün olup olmadığını merak ettim.
Temel olarak, Beden yaratılır, dünyayla ve benzerleriyle etkileşime girer. Ve vücudun sınırlayıcı kutusuna ihtiyacım vardı. Mümkün mü?
Yanıtlar:
Box2D'de, gövdelerin kendileriyle ilişkili sınırlayıcı kutuları yoktur, fikstür de. Yani tüm armatürleri tekrarlamanız ve yeni bir AABB oluşturmanız gerekiyor. Bunun gibi bir şey:
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();
}
sadece fikstür aabb'ı kullanmak da şekil yarıçapını içerir - eğer şekil yarıçapı olmadan gerçek aabb almak istiyorsanız, bunu şöyle yapın:
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;
ve shapeAABB.upperBound = shapeAABB.upperBound - r;
istediğim davranışı elde etmek zorunda kaldım.
Gerçekten, bir for döngüsü, yineleme için genellikle daha iyidir. @Noel yanıtı alarak:
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
Boolean olarak alınan ifade , anlıyorum fixture != NULL
.
Genelde kullandığım şey bu:
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);
Bu bir üst düğüm. Ben bile bu düğümün kendisine ekledim (örn. SomeNode) ve bu da işe yarıyor gibi görünüyor, sadece z-endeksinizin yeterince yüksek olduğundan emin olun.
fixture->GetAABB()
mevcut değil, birfixture->GetAABB(int32 childIndex)
yok.