Box2D:导致“多边形退化”的三角形

时间:2016-04-20 00:36:47

标签: c++ ubuntu ubuntu-14.04 box2d

我目前正在将一个小型游戏引擎移植到 Linux Ubuntu 14.04.4 。一切都很好,但我遇到了Box2D的问题。我使用Poly2Tri对我的形状进行三角测量。该库返回逆时针三角形,然后我用{。

创建Box2D fixtures

有些三角形有效,但至少有一个没有,例如:

P1: (-0.135156, -0.042188)
P2: (-0.136719, -0.050000)
P3: (-0.131250, -0.053125)

如您所见,此三角形是逆时针方向。当Box2D尝试使用polygonShape->Set()创建具有这些顶点的形状时,我得到多边形是退化断言:

/build/buildd/box2d-2.3.0+ds/Box2D/Box2D/Collision/Shapes/b2PolygonShape.cpp:158: void b2PolygonShape::Set(const b2Vec2*, int32): Assertion `false' failed.

我想知道为什么会得到这个?经过一些研究,我发现多边形必须是逆时针而不是太小(坐标必须大于0.00001或其他),但我的三角形尊重两个约束。此外,在Windows上运行良好!

值得注意的是,如果Box2D的凸包算法在多边形上打破(或者我听说过),似乎可以抛出这个断言。

Box2D版本:

  • 在Ubuntu上:2.3.0 + ds-2
  • 在Windows上:2.3.0

1 个答案:

答案 0 :(得分:1)

根据the source that I've founddef isfloat(string): try: float(string) except ValueError: return False else: return True 将彼此靠近的顶点粘在一起。关闭意味着平方距离小于b2PolygonShape::Set()的一半,默认情况下定义为0.005f

这意味着距离小于b2_linearSlop,即sqrt(0.005f / 2)。这绝对是您的情况,您可能希望将0.05重新定义为更小的值,或者扩大点的坐标。

注意:顶点胶合的数学运算因Box2D版本而异,但确保顶点比b2_linearSlop更远似乎是安全的。