¿Usando la función Box2D Polygon "Set ()"?

11

Estoy usando el motor de física Box2D. Y hay un tipo de forma para box2D llamada b2PolygonShape.

En esta clase, puedes crear polígonos. También hay una función Set () que toma una matriz de puntos y un conteo de vértices.

Box2D tiene un ejemplo como este:

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

Esto funciona. Sin embargo, cuando intenté practicar y jugar con esta función, hice esto:

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

Cuando compilé y ejecuté esto, se bloqueó después de la función Set (). ¿No crearía esto un cuadrado?

También en la consola obtuve esto:

Assertion failed: s > 0.0f

¿Qué hice mal?

xAustechx
fuente

Respuestas:

10

Esto se debe a que los cuatro vértices que proporcionó están en el sentido de las agujas del reloj y Box2D supone que están en el sentido contrario a las agujas del reloj, como en su primer ejemplo. Por lo tanto, debería funcionar bien si lo cambia a:

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

Y, por cierto, si solo está creando un polígono en forma de caja, puede usar la función de conveniencia

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)
Noel Llopis
fuente
¿Hay alguna manera de hacer que no asuma? Lo que intento hacer es crear un programa en el que puedas dibujar formas, como PHUN. Y ahí es donde llegué a estos errores, así que decidí probarlo con el rectángulo.
xAustechx
1
Realmente no. Los polígonos deben ser convexos y, por lo tanto, deben asumir el orden de bobinado para verificar eso. Si vas a dibujar y crear polígonos sobre la marcha, debes preprocesarlos para asegurarte de que estén por debajo del límite de conteo de vértices (creo que son 6 u 8 verts) y en ese punto también podrías enrollarlos correctamente antes de pasarlos a Box2D.
Noel Llopis
0

Puede determinar el devanado del polígono y luego invertirlo si es en sentido antihorario.

Un método común es calcular el área del polígono usando el algoritmo a continuación. Devolverá un número + ve para el devanado en sentido horario, y un número -ve para el devanado en sentido antihorario.

Aquí hay un ejemplo de 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
fuente