Box2D एक शरीर के बाउंडिंग बॉक्स जाओ


12

Box2D में, मैं उत्सुक था कि क्या यह संभव है कि दुनिया में पहले से निर्मित किसी निकाय का बाउंडिंग बॉक्स मिल जाए।

तो मूल रूप से, बॉडी बनाई गई है, यह दुनिया और इस तरह के साथ बातचीत कर रही है। और मुझे उस बॉडी के बाउंडिंग बॉक्स की जरूरत थी। क्या यह संभव है?

जवाबों:


11

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

1
क्या यह वास्तव में सही है। Box2d में मैं उपयोग कर रहा हूं, fixture->GetAABB()मौजूद नहीं है, लेकिन एक fixture->GetAABB(int32 childIndex)है।
जॉनी

ऊपरी और निचले हिस्से के ऊपरी और निचले कोने हैं?
जोकून

1

बस फ़िक्स एब का उपयोग करने में आकृति त्रिज्या भी शामिल है - यदि आप आकृति के त्रिज्या के बिना वास्तविक 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();
}

आप आकृति त्रिज्या क्यों नहीं प्राप्त करना चाहेंगे? मैंने मूल रूप से इस उत्तर से स्रोत की नकल की, यह सोचकर कि यह अन्य उत्तरों की तुलना में अधिक गहन था, लेकिन अब मैंने पाया है कि यह मेरे मामले के लिए सही नहीं है, और मैं उत्सुक हूं कि इस कोड का उपयोग किस परिदृश्य में किया जाना चाहिए।
मिच

मैं देखता हूं कि यह नए Box2D एपीआई का उपयोग करता है, हालांकि। यह उत्तर पसंद करने का एक कारण है। हालांकि, जो मैंने ऊपर उल्लेख किया है, उससे संबंधित, मुझे टिप्पणी करनी थी 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);

जहां यह कुछ मूल नोड है। मैंने इसे नोड में भी जोड़ दिया है (जैसे someNode) और वह भी काम करने लगता है, बस यह सुनिश्चित कर लें कि आपका z-index काफी अधिक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.