Korzystasz z funkcji „Set ()” wielokąta Box2D?

11

Używam silnika fizyki Box2D. Istnieje także rodzaj kształtu dla box2D o nazwie b2PolygonShape.

W tej klasie możesz tworzyć wielokąty. Istnieje również funkcja Set (), która pobiera tablicę punktów i liczbę wierzchołków.

Box2D ma taki przykład:

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

To działa. Jednak kiedy próbowałem ćwiczyć i zadzierać z tą funkcją, zrobiłem to:

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

Kiedy skompilowałem i uruchomiłem to, zawiesił się po funkcji Set (). Czy to nie stworzy kwadratu?

Również w konsoli mam to:

Assertion failed: s > 0.0f

Co zrobiłem źle?

xAustechx
źródło

Odpowiedzi:

10

Jest tak, ponieważ cztery podane wierzchołki są w kolejności zgodnej z ruchem wskazówek zegara, a Box2D zakłada, że ​​są w kierunku przeciwnym do ruchu wskazówek zegara, jak w twoim pierwszym przykładzie. Więc powinno działać dobrze, jeśli zmienisz na:

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

Nawiasem mówiąc, jeśli tworzysz wielokąt w kształcie pudełka, możesz skorzystać z funkcji wygody

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)
Noel Llopis
źródło
Czy istnieje sposób, aby nie zakładać? Staram się stworzyć program, w którym możesz po prostu rysować kształty, takie jak PHUN. I tutaj doszedłem do tych błędów, więc postanowiłem wypróbować to z prostokątem.
xAustechx
1
Nie całkiem. Wielokąty muszą być wypukłe, więc aby to sprawdzić, należy przyjąć kolejność uzwojenia. Jeśli zamierzasz rysować i tworzyć wielokąty w locie, musisz je wstępnie przetworzyć, aby upewnić się, że znajdują się poniżej limitu liczby wierzchołków (myślę, że to 6 lub 8 wierzchołków). W tym momencie możesz równie dobrze nawiń je poprawnie, zanim przekażesz je Box2D.
Noel Llopis,
0

Możesz określić uzwojenie wielokąta, a następnie odwrócić je, jeśli jest przeciwnie do ruchu wskazówek zegara.

Jedną z powszechnych metod jest obliczanie powierzchni wielokąta za pomocą poniższego algorytmu. Zwróci liczbę + ve dla uzwojenia zgodnie z ruchem wskazówek zegara, i liczbę -ve dla uzwojenia przeciwnego do ruchu wskazówek zegara.

Oto przykład w języku 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
źródło