PolygonShape 断言 "area > 1.19209289550781250000e-7F"
PolygonShape asserts with "area > 1.19209289550781250000e-7F"
我正在制作一个地板是随机生成的非凸多边形的游戏。
多边形的顶点被传递给以下(伪代码)方法:
private void createPolygon (FloatArray vertices) {
short[] triangleIndices = new EarClippingTriangulator()
.computeTriangles(vertices)
.items;
myPolygon = new PolygonSprite(
new PolygonRegion(textureRegion, vertices.items, triangleIndices));
// myPolygon is correctly rendered
// now I want to create a Box2D static body with this shape
PolygonShape myShape = new PolygonShape();
Array<Vector2> vect = toVector2Array(vertices);
for (int i = 0; i < triangleIndices.length / 3; i++) {
// Error!
myShape.set(new float[] {
vect.get(triangleIndices[3 * i + 0]).x,
vect.get(triangleIndices[3 * i + 0]).y,
vect.get(triangleIndices[3 * i + 1]).x,
vect.get(triangleIndices[3 * i + 1]).y,
vect.get(triangleIndices[3 * i + 2]).x,
vect.get(triangleIndices[3 * i + 2]).y });
myBody.createFixture(myShape, 0);
}
}
通常这种方法很有效,但有时游戏会崩溃:
AL lib: (EE) alc_cleanup: 1 device not closed
Assertion failed!
Program: C:\Program Files\Java\jre1.8.0_25\bin\javaw.exe
File: /var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp, Line 158 or 223
Expression: false
或
Expression: area > 1.19209289550781250000e-7F
传递给“myShape.set()”的float[]包含(崩溃时):
- x1: -1061.4121;
- y1: -2178.179;
- x2: 888.95154;
- y2: -154.1218;
- x3: 888.98663;
- y3: -154.08865;
如果我没理解错的话,这是因为三角形太小了。
我该怎么做才能避免这个问题,或者忽略这些小三角形?
提前致谢
#2 点和#3 点非常接近,这可能是图书馆不喜欢的地方。
也许,你可以改进你的随机点生成器来避免两个点太靠近。
一个粗略但有效的方法来解决这个问题,就是使用与 Box2D 相同的检查来触发该断言。查看b2PolygonShape.cpp中函数内部的代码决定是否触发这个断言。将该代码复制(或移植)到您自己的程序中,以便您可以先发制人地检查断言是否会触发。如果它会触发,请不要创建该装置 :)
我正在制作一个地板是随机生成的非凸多边形的游戏。
多边形的顶点被传递给以下(伪代码)方法:
private void createPolygon (FloatArray vertices) {
short[] triangleIndices = new EarClippingTriangulator()
.computeTriangles(vertices)
.items;
myPolygon = new PolygonSprite(
new PolygonRegion(textureRegion, vertices.items, triangleIndices));
// myPolygon is correctly rendered
// now I want to create a Box2D static body with this shape
PolygonShape myShape = new PolygonShape();
Array<Vector2> vect = toVector2Array(vertices);
for (int i = 0; i < triangleIndices.length / 3; i++) {
// Error!
myShape.set(new float[] {
vect.get(triangleIndices[3 * i + 0]).x,
vect.get(triangleIndices[3 * i + 0]).y,
vect.get(triangleIndices[3 * i + 1]).x,
vect.get(triangleIndices[3 * i + 1]).y,
vect.get(triangleIndices[3 * i + 2]).x,
vect.get(triangleIndices[3 * i + 2]).y });
myBody.createFixture(myShape, 0);
}
}
通常这种方法很有效,但有时游戏会崩溃:
AL lib: (EE) alc_cleanup: 1 device not closed
Assertion failed!
Program: C:\Program Files\Java\jre1.8.0_25\bin\javaw.exe
File: /var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp, Line 158 or 223Expression: false
或
Expression: area > 1.19209289550781250000e-7F
传递给“myShape.set()”的float[]包含(崩溃时):
- x1: -1061.4121;
- y1: -2178.179;
- x2: 888.95154;
- y2: -154.1218;
- x3: 888.98663;
- y3: -154.08865;
如果我没理解错的话,这是因为三角形太小了。 我该怎么做才能避免这个问题,或者忽略这些小三角形? 提前致谢
#2 点和#3 点非常接近,这可能是图书馆不喜欢的地方。
也许,你可以改进你的随机点生成器来避免两个点太靠近。
一个粗略但有效的方法来解决这个问题,就是使用与 Box2D 相同的检查来触发该断言。查看b2PolygonShape.cpp中函数内部的代码决定是否触发这个断言。将该代码复制(或移植)到您自己的程序中,以便您可以先发制人地检查断言是否会触发。如果它会触发,请不要创建该装置 :)