Використовуючи полігон Box2D “Set ()”?


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

Що я зробив не так?

Відповіді:


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.