বক্স 2 ডি-তে, আমি কৌতূহল ছিলাম যদি ইতিমধ্যে বিশ্বে তৈরি করা কোনও দেহের একটি বাউন্ডিং বক্স পাওয়া সম্ভব হয়।
সুতরাং মূলত, দেহটি তৈরি করা হয়, এটি বিশ্বের এবং এই জাতীয় সাথে যোগাযোগ করে। এবং আমার সেই দেহের বাউন্ডিং বাক্সটি দরকার ছিল। এটা কি সম্ভব?
বক্স 2 ডি-তে, আমি কৌতূহল ছিলাম যদি ইতিমধ্যে বিশ্বে তৈরি করা কোনও দেহের একটি বাউন্ডিং বক্স পাওয়া সম্ভব হয়।
সুতরাং মূলত, দেহটি তৈরি করা হয়, এটি বিশ্বের এবং এই জাতীয় সাথে যোগাযোগ করে। এবং আমার সেই দেহের বাউন্ডিং বাক্সটি দরকার ছিল। এটা কি সম্ভব?
উত্তর:
বক্স 2 ডি-তে, সংস্থাগুলির সাথে সংযুক্ত বাউন্ডিং বাক্স নেই fi সুতরাং আপনাকে সমস্ত ফিক্সচারগুলিতে পুনরাবৃত্তি করতে হবে এবং একটি নতুন এএবিবি তৈরি করতে হবে। এটার মতো কিছু:
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();
}
কেবল ফিক্সচার আবাব ব্যবহার করে আকৃতির ব্যাসার্ধেরও অন্তর্ভুক্ত থাকে - আপনি যদি আকারের ব্যাসার্ধ ছাড়াই আসল আবাব পেতে চান তবে এটি এটি করুন:
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;
আমার যে আচরণটি চেয়েছিল তা পেতে হয়েছিল।
সত্যই, একটি লুপ সাধারণত পুনরাবৃত্তির জন্য ভাল। @ নোয়েলের জবাব নেওয়া:
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);
যেখানে এটি কিছু অভিভাবক নোড। এমনকি আমি এটিকে নোডে নিজেই যুক্ত করেছি (উদাঃ কিছু নোড) এবং এটিও কাজ করে বলে মনে হচ্ছে, কেবল আপনার জেড-সূচকটি যথেষ্ট বেশি কিনা তা নিশ্চিত করুন।
fixture->GetAABB()
বিদ্যমান নেই, তবে একটি রয়েছেfixture->GetAABB(int32 childIndex)
।