Usando a função “Set ()” do Box2D Polygon?

11

Estou usando o mecanismo de física Box2D. E há um tipo de forma para box2D chamado b2PolygonShape.

Nesta classe, você pode criar polígonos. Há também uma função Set () que recebe uma matriz de pontos e uma contagem de vértices.

Box2D tem um exemplo 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);

Isso funciona. No entanto, quando tentei praticar e mexer com essa função, fiz o seguinte:

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

Quando eu compilei e executei isso, ele travou após a função Set (). Isso não criaria um quadrado?

Também no console eu consegui isso:

Assertion failed: s > 0.0f

O que eu fiz errado?

xAustechx
fonte

Respostas:

10

Isso ocorre porque os quatro vértices que você forneceu estão no sentido horário e o Box2D assume que estão no sentido anti-horário, como no seu primeiro exemplo. Portanto, deve funcionar bem se você alterar para:

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

E, a propósito, se você está apenas criando um polígono em forma de caixa, pode usar a função de conveniência

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)
Noel Llopis
fonte
Existe uma maneira de fazê-lo não assumir? O que estou tentando fazer é criar um programa no qual você possa desenhar formas, como PHUN. E foi aí que encontrei esses erros, então decidi experimentar com o retângulo.
XAustechx
1
Na verdade não. Os polígonos precisam ser convexos e, portanto, devem assumir a ordem do enrolamento para verificar isso. Se você estiver desenhando e criando polígonos em tempo real, precisará pré-processá-los para garantir que estejam abaixo do limite de contagem de vértices (acho que são 6 ou 8 verts) e, nesse ponto, você também enrole-os corretamente antes de entregá-los ao Box2D.
precisa
0

Você pode determinar o enrolamento do polígono e, em seguida, inverter se estiver no sentido anti-horário.

Um método comum é calcular a área do polígono usando o algoritmo abaixo. Ele retornará um número + ve para o enrolamento no sentido horário e um número -ve para o enrolamento no sentido anti-horário.

Aqui está um exemplo 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
fonte