Usando la funzione “Set ()” del poligono Box2D?


11

Sto usando il motore fisico Box2D. E c'è un tipo di forma per box2D chiamato b2PolygonShape.

In questa classe, puoi creare poligoni. C'è anche una funzione Set () che accetta una matrice di punti e un conteggio dei vertici.

Box2D ha un esempio come questo:

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

Questo funziona Tuttavia, quando ho cercato di esercitarmi e confondere con questa funzione, ho fatto questo:

  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 ho compilato ed eseguito questo, si è arrestato in modo anomalo dopo la funzione Set (). Questo non creerebbe un quadrato?

Anche nella console ho ottenuto questo:

Assertion failed: s > 0.0f

Cos'ho fatto di sbagliato?

Risposte:


10

Questo perché i quattro vertici che hai fornito sono in senso orario e Box2D presume che siano in senso antiorario, come nel tuo primo esempio. Quindi dovrebbe funzionare bene se lo cambi 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);

E a proposito, se stai solo creando un poligono a forma di scatola, puoi usare la funzione convenienza

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

C'è un modo per farlo non assumere? Quello che sto cercando di fare è creare un programma in cui puoi semplicemente disegnare forme, un po 'come PHUN. Ed è qui che sono arrivato a questi errori, quindi ho deciso di provarlo con il rettangolo.
xAustechx,

1
Non proprio. I poligoni devono essere convessi e quindi devono assumere l'ordine di avvolgimento per verificarlo. Se stai per disegnare e creare poligoni al volo, devi pre-elaborarli per assicurarti che siano al di sotto del limite di conteggio dei vertici (penso che siano 6 o 8 verti) e a quel punto potresti anche avvolgerli correttamente prima di consegnarli a Box2D.
Noel Llopis,

0

È possibile determinare l'avvolgimento del poligono e quindi invertirlo se è antiorario.

Un metodo comune è calcolare l'area del poligono utilizzando l'algoritmo seguente. Restituirà un numero + ve per l'avvolgimento in senso orario e un numero -ve per l'avvolgimento in senso antiorario.

Ecco un esempio di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.