Verwenden der Box2D-Polygon-Funktion „Set ()“?

11

Ich benutze die Box2D-Physik-Engine. Und es gibt eine Form für box2D namens b2PolygonShape.

In dieser Klasse können Sie Polygone erstellen. Es gibt auch eine Set () - Funktion, die ein Array von Punkten und eine Scheitelpunktanzahl verwendet.

Box2D hat ein Beispiel wie dieses:

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

Das funktioniert. Als ich jedoch versuchte, diese Funktion zu üben und zu spielen, tat ich Folgendes:

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

Als ich dies kompilierte und ausführte, stürzte es nach der Set () - Funktion ab. Würde dies nicht ein Quadrat schaffen?

Auch in der Konsole habe ich folgendes bekommen:

Assertion failed: s > 0.0f

Was habe ich falsch gemacht?

xAustechx
quelle

Antworten:

10

Dies liegt daran, dass die vier von Ihnen angegebenen Scheitelpunkte im Uhrzeigersinn angeordnet sind und Box2D davon ausgeht, dass sie sich wie in Ihrem ersten Beispiel gegen den Uhrzeigersinn befinden. Es sollte also gut funktionieren, wenn Sie es ändern in:

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

Übrigens, wenn Sie nur ein kastenförmiges Polygon erstellen, können Sie die Komfortfunktion verwenden

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)
Noel Llopis
quelle
Gibt es eine Möglichkeit, es nicht anzunehmen? Ich versuche, ein Programm zu erstellen, in dem Sie einfach Formen zeichnen können, ähnlich wie bei PHUN. Und hier bin ich zu diesen Fehlern gekommen, also habe ich beschlossen, es mit dem Rechteck auszuprobieren.
xAustechx
1
Nicht wirklich. Polygone müssen konvex sein und daher die Wicklungsreihenfolge annehmen, um dies zu überprüfen. Wenn Sie Polygone im laufenden Betrieb zeichnen und erstellen möchten, müssen Sie sie vorverarbeiten, um sicherzustellen, dass sie unter der Vertex-Anzahl liegen (ich denke, es sind 6 oder 8 Verts), und an diesem Punkt können Sie dies auch tun Wickeln Sie sie richtig auf, bevor Sie sie an Box2D übergeben.
Noel Llopis
0

Sie können die Wicklung des Polygons bestimmen und dann umkehren, wenn es gegen den Uhrzeigersinn ist.

Eine übliche Methode besteht darin, die Fläche des Polygons mit dem folgenden Algorithmus zu berechnen. Es wird eine + ve Nummer für das Wickeln im Uhrzeigersinn und eine -ve Nummer für das Wickeln gegen den Uhrzeigersinn zurückgegeben.

Hier ist ein Python-Beispiel:

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
quelle