Box2D बहुभुज "सेट ()" फ़ंक्शन का उपयोग करना?


11

मैं Box2D भौतिकी इंजन का उपयोग कर रहा हूं। और बॉक्स 2 डी के लिए आकृति का एक प्रकार है जिसे b2PolygonShape कहा जाता है।

इस वर्ग में, आप बहुभुज बना सकते हैं। इसमें एक सेट () फ़ंक्शन भी होता है जो पॉइंट्स की एक सरणी और एक शीर्ष गिनती लेता है।

Box2D इस तरह एक उदाहरण है:

// This defines a triangle in CCW order.

b2Vec2 vertices[3];

vertices[0].Set(0.0f, 0.0f);

vertices[1].Set(1.0f, 0.0f);

vertices[2].Set(0.0f, 1.0f);

int32 count = 3;



b2PolygonShape polygon;

polygon.Set(vertices, count);

यह काम। फिर भी जब मैंने इस समारोह के साथ अभ्यास करने और गड़बड़ करने की कोशिश की, तो मैंने ऐसा किया:

  b2Vec2 vertices[4];

  vertices[0].Set(0, 0);
  vertices[1].Set(0,10);
  vertices[2].Set(10,10);
  vertices[3].Set(10,0);

  int32 count = 4;

  b2PolygonShape polygon;

  polygon.Set(vertices, count);

जब मैंने इसे संकलित और चलाया, तो यह सेट () फ़ंक्शन के बाद क्रैश हो गया। क्या यह एक वर्ग नहीं बनाएगा?

कंसोल में भी मुझे यह मिला:

Assertion failed: s > 0.0f

मैंने गलत क्या किया?

जवाबों:


10

ऐसा इसलिए है क्योंकि आपके द्वारा प्रदान किए गए चार कोने दक्षिणावर्त क्रम में हैं और Box2D मानता है कि वे काउंटर-क्लॉकवाइज हैं, जैसे आपके पहले उदाहरण में। यदि आप इसे बदलते हैं तो यह ठीक काम करना चाहिए:

  b2Vec2 vertices[4];

  vertices[0].Set(0, 0);
  vertices[1].Set(10,0);
  vertices[2].Set(10,10);
  vertices[3].Set(0,10);

  int32 count = 4;

  b2PolygonShape polygon;

  polygon.Set(vertices, count);

और वैसे, यदि आप केवल एक बॉक्स के आकार का बहुभुज बना रहे हैं, तो आप सुविधा फ़ंक्शन का उपयोग कर सकते हैं

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)

क्या यह मानने का कोई तरीका है? मैं जो करने की कोशिश कर रहा हूं वह एक ऐसा कार्यक्रम है जहां आप सिर्फ PHUN जैसे आकार बना सकते हैं। और यही वह जगह है जहाँ मैं इन त्रुटियों के लिए आया था इसलिए मैंने इसे आयत के साथ आज़माने का फैसला किया।
xAustechx

1
ज़रुरी नहीं। बहुभुजों को उत्तल करने की आवश्यकता होती है और इसलिए इसे सत्यापित करने के लिए घुमावदार आदेश को मानने की आवश्यकता होती है। यदि आप ड्राइंग बनाने जा रहे हैं और मक्खी पर बहुभुज बना रहे हैं, तो आपको यह सुनिश्चित करने के लिए उन्हें पूर्व-संसाधित करने की आवश्यकता है कि वे शीर्ष गणना की सीमा के तहत हैं (मुझे लगता है कि यह 6 या 8 वाट्स का है) और उस बिंदु पर आप भी हो सकते हैं इससे पहले कि आप उन्हें Box2D को सौंप दें, उन्हें सही ढंग से हवा दें।
नोएल ललोपिस

0

आप बहुभुज के घुमावदार का निर्धारण कर सकते हैं, और फिर इसे उल्टा कर सकते हैं अगर यह विरोधी घड़ी की दिशा में है।

एक सामान्य विधि नीचे एल्गोरिथ्म का उपयोग करके बहुभुज के क्षेत्र की गणना करना है। यह दक्षिणावर्त वाइंडिंग के लिए + वी नंबर और एंटीक्लॉकवाइड वाइंडिंग के लिए -ve नंबर लौटाएगा।

यहाँ एक पायथन उदाहरण है:

def poly_area(verts):
    """
    Return area of a simple (ie. non-self-intersecting) polygon.
    Will be negative for counterclockwise winding.
    """
    accum = 0.0
    for i in range(len(verts)):
        j = (i + 1) % len(verts)
        accum += verts[j][0] * verts[i][1] - verts[i][0] * verts[j][1]
    return accum / 2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.