Использование функции «Set ()» в многоугольнике Box2D?

11

Я использую физический движок Box2D. И есть тип формы для box2D, который называется b2PolygonShape.

В этом классе вы можете создавать полигоны. Существует также функция Set (), которая принимает массив точек и количество вершин.

У Box2D есть такой пример:

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

Это работает. Тем не менее, когда я попытался попрактиковаться с этой функцией, я сделал это:

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

Когда я скомпилировал и запустил это, он потерпел крах после функции Set (). Разве это не создаст квадрат?

Также в консоли я получил это:

Assertion failed: s > 0.0f

Что я сделал не так?

xAustechx
источник

Ответы:

10

Это потому, что четыре вершины, предоставленные вами в порядке по часовой стрелке и Box2D предполагает, что они находятся в направлении против часовой стрелки, как и в первом примере. Так что он должен работать нормально, если вы измените его на:

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

И, кстати, если вы просто создаете многоугольник в форме коробки, вы можете использовать удобную функцию

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)
Ноэль Ллопис
источник
Есть ли способ заставить его не предполагать? Я пытаюсь создать программу, в которой вы можете просто рисовать фигуры, вроде PHUN. И вот где я пришел к этим ошибкам, поэтому я решил попробовать это с прямоугольником.
xAustechx
1
На самом деле, нет. Полигоны должны быть выпуклыми, поэтому для подтверждения этого необходимо принять порядок намотки. Если вы собираетесь рисовать и создавать многоугольники на лету, вам необходимо предварительно обработать их, чтобы убедиться, что они находятся под пределом числа вершин (я думаю, что это 6 или 8 вершин), и в этот момент вы можете также намотайте их правильно, прежде чем передать их Box2D.
Ноэль Ллопис
0

Вы можете определить намотку многоугольника, а затем развернуть его, если он против часовой стрелки.

Одним из распространенных методов является вычисление площади многоугольника с использованием приведенного ниже алгоритма. Он вернет число + ve для намотки по часовой стрелке и число -ve для намотки против часовой стрелки.

Вот пример 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
источник