ใช้ฟังก์ชั่น“ Set ()” รูปหลายเหลี่ยม Box2D หรือไม่


11

ฉันใช้เครื่องยนต์ฟิสิกส์ Box2D และมีรูปร่างชนิดหนึ่งสำหรับ box2D เรียกว่า b2PolygonShape

ในชั้นนี้คุณสามารถสร้างรูปหลายเหลี่ยม นอกจากนี้ยังมีฟังก์ชั่น Set () ที่รับอาร์เรย์ของคะแนนและการนับจุดสุดยอด

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

เมื่อฉันรวบรวมและเรียกใช้สิ่งนี้มันล้มเหลวหลังจากฟังก์ชัน Set () สิ่งนี้จะไม่สร้างสี่เหลี่ยมหรือไม่?

นอกจากนี้ในคอนโซลฉันได้รับสิ่งนี้:

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 verts) และ ณ จุดนั้นคุณก็เช่นกัน ไขให้ถูกต้องก่อนส่งมอบให้กับ Box2D
Noel Llopis

0

คุณสามารถกำหนดความคดเคี้ยวของรูปหลายเหลี่ยมแล้วย้อนกลับถ้ามันเป็นทวนเข็มนาฬิกา

วิธีการหนึ่งที่พบบ่อยคือการคำนวณพื้นที่ของรูปหลายเหลี่ยมโดยใช้อัลกอริทึมด้านล่าง มันจะส่งกลับตัวเลข + ve สำหรับการหมุนตามเข็มนาฬิกาและตัวเลข -ve สำหรับการหมุนวนทวนเข็มนาฬิกา

นี่คือตัวอย่างของ Python:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.