【问题标题】:Box2D (C++) triangle shape failing area assertBox2D (C++) 三角形失败区域断言
【发布时间】:2017-07-10 06:50:13
【问题描述】:

我正在使用以下代码在 Box2D (C++) 中创建一个三角形多边形:

b2FixtureDef fixtureDef;
b2PolygonShape dynamicPolygon;
b2Vec2 vertices[3];
vertices[0].Set(0, -1);
vertices[1].Set(-1, 1);
vertices[2].Set(1, 1);
dynamicPolygon.Set(vertices, 3);
fixtureDef.shape = &dynamicPolygon;

但是,在运行此代码时,我收到此错误:

a.out: ./Box2D/Collision/Shapes/b2PolygonShape.cpp:127: b2Vec2 ComputeCentroid(const b2Vec2*, int32): Assertion `area > 1.19209289550781250000e-7F' failed.

面积好像太小了,不过,点应该是正确的三角形吧?

有什么想法吗?

【问题讨论】:

    标签: c++ box2d polygon shape vertex


    【解决方案1】:

    我需要交换顶点 1 和 2 的值:

    b2FixtureDef fixtureDef;
    b2PolygonShape dynamicPolygon;
    b2Vec2 vertices[3];
    vertices[0].Set(0, -1);
    vertices[1].Set(1, 1);
    vertices[2].Set(-1, 1);
    dynamicPolygon.Set(vertices, 3);
    fixtureDef.shape = &dynamicPolygon;
    

    此选项将顶点按逆时针顺序排列...

    【讨论】:

    • 可能是因为您用于计算面积的公式取决于顶点顺序。如果我们没有看到代码很难说,但考虑到错误信息以及您如何解决它,这似乎是原因。
    • 我认为您最初是顺时针放置的,但您必须逆时针放置它们。这是 box2d 期望的方式。来自用户手册:“多边形顶点以逆时针缠绕(CCW)存储......”
    • 不这么认为吗?在您的答案中(第二个有效的选项),您的第一个顶点在 y 轴上,在 x 轴下方,您的第二个顶点在象限 I 中,第三个顶点在象限 II 中。因此,正如 b2d 所期望的那样,您以逆时针运动定义它们,因此它以这种方式工作。
    • @PeterR 啊,我现在明白了。我认为第一点高于其他 2,因为我认为 -1 更高(就像在屏幕上一样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多