C++ 框2d:三角形引起的“;“多边形退化”;

C++ 框2d:三角形引起的“;“多边形退化”;,c++,ubuntu,ubuntu-14.04,box2d,C++,Ubuntu,Ubuntu 14.04,Box2d,我目前正在将一个小游戏引擎移植到Linux Ubuntu 14.04.4。一切都很好,但我遇到了一个问题。我习惯于用三角形表示我的形状。这个库返回逆时针方向的三角形,然后用它创建 有些三角形可以工作,但至少有一个不行,例如: P1: (-0.135156, -0.042188) P2: (-0.136719, -0.050000) P3: (-0.131250, -0.053125) 如你所见,这个三角形是逆时针的。当Box2D尝试使用polygonShape->Set()创建具有这些顶点的形

我目前正在将一个小游戏引擎移植到Linux Ubuntu 14.04.4。一切都很好,但我遇到了一个问题。我习惯于用三角形表示我的形状。这个库返回逆时针方向的三角形,然后用它创建

有些三角形可以工作,但至少有一个不行,例如:

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
根据,
b2PolygonShape::Set()
将彼此靠近的顶点粘合在一起。闭合表示平方距离小于默认定义为的b2_linearSlop的一半

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


注意:顶点粘合的数学方法在不同的Box2D版本中有所不同,但确保顶点距离
0.05f
似乎是安全的。

如果您有Box2D源代码,请查看Collision/Shapes/b2PolygonShape.cpp,看看您是否能找到它实际检查的内容。哇!是的,我修改代码以过滤出更多的点。然而,我的Box2D版本有这样一点:
如果(b2DistanceSquared(v,ps[j])<((0.5f*b2_linearSlop)*(0.5f*b2_linearSlop))
如果距离小于
0.0025
,那么它不会失败吗?@fordcars和您的Box2D中
b2_linearSlop
的值是多少?另外,您似乎正在使用Box2D 2.3.0,这是-代码是一样的。你确定你正在查看正确的文件和正确的函数吗?0.005:)我已经添加了过滤,我的代码现在可以工作了