使用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

我做错什么了?

Answers:


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之前,请正确缠绕它们。
Noel Llopis

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.