Box2D Çokgen “Set ()” fonksiyonunu mu kullanıyorsunuz?


11

Box2D fizik motorunu kullanıyorum. Ve box2D için b2PolygonShape adı verilen bir şekil var.

Bu sınıfta çokgenler oluşturabilirsiniz. Bir dizi nokta ve bir tepe noktası sayısı alan bir Set () işlevi de vardır.

Box2D'nin böyle bir örneği var:

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

Bu çalışıyor. Yine de bu işlevle pratik yapmaya ve karışıklığa uğramaya çalıştığımda bunu yaptım:

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

Bunu derleyip çalıştırdığımda, Set () işlevinden sonra çöktü. Bu bir kare oluşturmaz mı?

Ayrıca konsolda bunu aldım:

Assertion failed: s > 0.0f

Neyi yanlış yaptım?

Yanıtlar:


10

Bunun nedeni, sağladığınız dört köşenin saat yönünde olması ve Box2D'nin ilk örneğiniz gibi saat yönünün tersine olduğunu varsaymasıdır. Yani şu şekilde değiştirirseniz iyi çalışmalıdır:

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

Bu arada, sadece kutu şeklinde bir çokgen oluşturuyorsanız, rahatlık işlevini kullanabilirsiniz

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

Varsaymamak için bir yol var mı? Yapmaya çalıştığım, sadece PHUN gibi şekiller çizebileceğiniz bir program yapmak. İşte bu hatalara geldim, bu yüzden dikdörtgeni denemeye karar verdim.
xAustechx

1
Pek sayılmaz. Çokgenlerin dışbükey olması gerekir ve bu nedenle bunu doğrulamak için sargı düzenini alması gerekir. Anında çokgen çizecek ve oluşturacaksanız, köşe sayısı sınırının altında olduklarından emin olmak için bunları önceden işlemelisiniz (bence 6 veya 8 verts) ve bu noktada da onları Box2D'ye vermeden önce doğru şekilde sarın.
Noel Llopis

0

Çokgenin sargısını belirleyebilir ve daha sonra saat yönünün tersine çevirirseniz tersine çevirebilirsiniz.

Yaygın bir yöntem, aşağıdaki algoritmayı kullanarak çokgenin alanını hesaplamaktır. Saat yönünde sarma için + ve, saat yönünün aksine sarma için -ve numarası döndürür.

İşte bir Python örneği:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.