断言失败:面积 > 1.19209。

3
我运行使用了Box2D的程序时出现了一个奇怪的错误,这真是出乎意料,因为它在一个与我的项目无关的文件中(未构建的文件夹没有链接到我的项目)。我为我的项目获取了VS12Box2D副本,并为我的项目构建了它,并按照这里的教程https://www.youtube.com/watch?v=kEClRFKyGkw&list=PLSPw4ASQYyymu3PfG9gxywSPghnSMiOAW&index=53设置了项目。

这是我的代码:

void Box::init(b2World* world, const glm::vec2& position, const glm::vec2& dimensions)
{
    m_dimensions = dimensions;
    b2BodyDef boxDef;
    boxDef.type = b2_dynamicBody;
    boxDef.position.Set(position.x, position.y);
    m_body = world->CreateBody(&boxDef);
    b2PolygonShape boxShape;
    boxShape.SetAsBox(position.x / 2.0f, position.y / 2.0f);

    b2FixtureDef fixtureDef;
    fixtureDef.shape = &boxShape;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;

    m_fixture = m_body->CreateFixture(&fixtureDef);
}

在我调用了 init() 的地方:

    b2Vec2 gravity(0.0f, -9.8f);
    m_world = std::make_unique<b2World>(gravity);
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(0.0f, -10.0f);
    b2Body* groundBody = m_world->CreateBody(&groundBodyDef);
    b2PolygonShape groundShape;
    groundShape.SetAsBox(50.0f, 10.0f);
    groundBody->CreateFixture(&groundShape, 0.0f);
    Box newBox;
    newBox.init(m_world.get(), glm::vec2(0.0f, 14.0f), glm::vec2(15.0f, 15.0f));
    m_boxes.push_back(newBox);

这是一个弹出窗口: Debug Error 我的控制台上打印的错误信息如下:
Assertion failed : area > 1.19209 2896e-07F, path_to_unbuild_box2d\box2d_v2.3.0\box2d\box2d\collision\shapes\b2 polygonshape.cpp, line 422
当我点击“重试”时,错误发生在这里:line 336 b2Fixture.h
inline void b2Fixture::GetMassData(b2MassData* massData) const
{
    m_shape->ComputeMass(massData, m_density);
}

问题1已修复

boxShape.SetAsBox(dimensions.x / 2.0f, dimensions.y / 2.0f); ///Instead of position.
1个回答

3

失败的代码行(如“断言失败”消息中所述)是:

b2Assert(area > b2_epsilon);

这意味着您的多边形很小(请看断言,面积小于1.192092896e-07F,即值为0.0000001192092896,非常微小)。

很可能是boxShape的大小无效。在以下行上设置断点:

boxShape.SetAsBox(position.x / 2.0f, position.y / 2.0f);

检查 position 的值。确保将盒子的尺寸设置为合理的值。我打赌你没有这样做。


position.x=0position.y=14的值是否无效? - Anish Silwal
想一想:你正在尝试创建一个宽度为0,高度为14的盒子。宽度为0的盒子听起来合法吗? - Cornstalks
谢谢,那是一个逻辑错误,我需要使用 dimension - Anish Silwal
另一个问题是,为什么我在文件中得到了一个错误,而我从未将其包含在我的项目中,但我有一个与我的项目链接的该文件夹的副本。 - Anish Silwal
Box2D代码包含一些编译的断言,这些断言包括一些调试信息(例如文件名和行号)。这是断言的一个巧妙特性,因此您可以知道哪个断言失败了。 - Cornstalks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接