বক্স 2 ডি একটি বডি বাউন্ডিং বক্স পান


12

বক্স 2 ডি-তে, আমি কৌতূহল ছিলাম যদি ইতিমধ্যে বিশ্বে তৈরি করা কোনও দেহের একটি বাউন্ডিং বক্স পাওয়া সম্ভব হয়।

সুতরাং মূলত, দেহটি তৈরি করা হয়, এটি বিশ্বের এবং এই জাতীয় সাথে যোগাযোগ করে। এবং আমার সেই দেহের বাউন্ডিং বাক্সটি দরকার ছিল। এটা কি সম্ভব?

উত্তর:


11

বক্স 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();
}

1
এটি কি সত্য? বক্স 2 ডিতে আমি ব্যবহার করছি, fixture->GetAABB()বিদ্যমান নেই, তবে একটি রয়েছে fixture->GetAABB(int32 childIndex)
জনি

উপরের এবং নীচের দিকের দিকের উপরের এবং বাম কোণে?
জোকুন

1

কেবল ফিক্সচার আবাব ব্যবহার করে আকৃতির ব্যাসার্ধেরও অন্তর্ভুক্ত থাকে - আপনি যদি আকারের ব্যাসার্ধ ছাড়াই আসল আবাব পেতে চান তবে এটি এটি করুন:

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();
}

আপনি কেন আকৃতি ব্যাসার্ধ পেতে চান না? আমি মূলত, এই উত্তর থেকে উৎস কপি চিন্তা এটি অন্যান্য উত্তর তুলনায় আরো পুঙ্খানুপুঙ্খ ছিল, কিন্তু এখন আমি পেয়েছি আমার ক্ষেত্রে জন্য সঠিক নয়, এবং প্রায় যা দৃশ্যকল্প এই কোড ব্যবহার করা উচিত জানতে আগ্রহী নই।
মিচ

আমি দেখতে পাচ্ছি যে এটি নতুন বক্স 2 ডি এপিআই ব্যবহার করে। এই উত্তর পছন্দ করার এক কারণ। তবে, আমি উপরে উল্লিখিত যা সম্পর্কিত, এর সাথে আমার মন্তব্য করতে হয়েছিল shapeAABB.lowerBound = shapeAABB.lowerBound + r;এবং shapeAABB.upperBound = shapeAABB.upperBound - r;আমার যে আচরণটি চেয়েছিল তা পেতে হয়েছিল।
মিচ

0

সত্যই, একটি লুপ সাধারণত পুনরাবৃত্তির জন্য ভাল। @ নোয়েলের জবাব নেওয়া:

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);

যেখানে এটি কিছু অভিভাবক নোড। এমনকি আমি এটিকে নোডে নিজেই যুক্ত করেছি (উদাঃ কিছু নোড) এবং এটিও কাজ করে বলে মনে হচ্ছে, কেবল আপনার জেড-সূচকটি যথেষ্ট বেশি কিনা তা নিশ্চিত করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.