我目前正在将一个小型游戏引擎移植到 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版本:
答案 0 :(得分:1)
根据the source that I've found,def 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
更远似乎是安全的。