Menggunakan fungsi The Box2D Polygon "Set ()"?

11

Saya menggunakan mesin fisika Box2D. Dan ada jenis bentuk untuk box2D disebut b2PolygonShape.

Di kelas ini, Anda bisa membuat poligon. Ada juga fungsi Set () yang mengambil array titik dan jumlah titik.

Box2D memiliki contoh seperti ini:

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

Ini bekerja. Namun ketika saya mencoba untuk berlatih dan mengacaukan fungsi ini, saya melakukan ini:

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

Ketika saya mengkompilasi dan menjalankan ini, crash setelah fungsi Set (). Bukankah ini akan membuat kotak?

Juga di konsol saya mendapatkan ini:

Assertion failed: s > 0.0f

Apa kesalahan yang telah aku perbuat?

xAustechx
sumber

Jawaban:

10

Itu karena empat simpul yang Anda berikan berada dalam urutan searah jarum jam dan Box2D menganggap mereka berlawanan arah jarum jam, seperti pada contoh pertama Anda. Jadi itu akan berfungsi dengan baik jika Anda mengubahnya ke:

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

Dan omong-omong, jika Anda hanya membuat poligon berbentuk kotak, Anda dapat menggunakan fungsi kenyamanan

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)
Noel Llopis
sumber
Apakah ada cara untuk membuatnya tidak menganggap? Yang saya coba lakukan adalah membuat program di mana Anda bisa menggambar bentuk, seperti PHUN. Dan di situlah saya sampai pada kesalahan ini jadi saya memutuskan untuk mencobanya dengan persegi panjang.
xAustechx
1
Tidak juga. Poligon harus berbentuk cembung sehingga perlu mengasumsikan urutan belitan untuk memverifikasi itu. Jika Anda akan menggambar dan membuat poligon dengan cepat, Anda perlu pra-proses mereka untuk memastikan mereka di bawah batas jumlah titik (saya pikir itu 6 atau 8 verts) dan pada titik itu Anda mungkin juga gulung dengan benar sebelum Anda menyerahkannya ke Box2D.
Noel Llopis
0

Anda bisa menentukan belitan poligon, dan kemudian membalikkannya jika berlawanan arah jarum jam.

Salah satu metode umum adalah menghitung luas poligon menggunakan algoritma di bawah ini. Ini akan mengembalikan nomor + ve untuk belitan searah jarum jam, dan nomor -ve untuk belitan berlawanan arah jarum jam.

Berikut ini adalah contoh 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
DrDeth
sumber