【问题标题】:Box2D World.GetBodyList() Returns NULL but World is Clearly Updating ObjectsBox2D World.GetBodyList() 返回 NULL 但 World 显然正在更新对象
【发布时间】:2020-05-29 07:59:30
【问题描述】:

最近将 Box2D 的主分支(无法将 2.3.1 版发布到 CMake)实现到一个项目中,用于快速 2D 物理和碰撞检测。一切正常,但是当我开始使用“World.GetBodyList()”函数时,它返回 NULL。这看起来很奇怪,因为我知道当动态对象落到静态对象上并在顶部保持平衡时,世界正在正确更新我创建的 2 个测试对象。

我只有 1 个世界对象,它是一个静态指针。

private:
        inline static b2World* s_world;

世界初始化

void Box2DWrapper::Box2DInit(glm::vec2 gravity)
    {
        b2Vec2 gravityVec = { gravity.x, gravity.y };
        s_world = new b2World(gravityVec);
    }

身体是如何产生的。

b2Body* Box2DWrapper::CreateRigidbodyBox(glm::vec2 position, glm::vec2 halfDimensions, bool isStatic, float objectDensity, float frictionCoefficient, float restitution, int16_t collisionGroup, Layers myCategories, Layers collisionCategories, bool fixedRotation, float angularDampening, float linearDampening, bool fastDynamicBulletCollisionCheck)
    {
        b2BodyDef newBodyDef;
        newBodyDef.position = { position.x, position.y };
        newBodyDef.angularDamping = angularDampening;
        newBodyDef.linearDamping = linearDampening;
        newBodyDef.fixedRotation = fixedRotation;
        newBodyDef.bullet = fastDynamicBulletCollisionCheck;
        if (!isStatic)
            newBodyDef.type = b2_dynamicBody;
        b2Body* boxBody = s_world->CreateBody(&newBodyDef);
        b2PolygonShape box;
        box.SetAsBox(halfDimensions.x, halfDimensions.y);
        b2FixtureDef boxDef;
        boxDef.shape = &box;
        boxDef.density = objectDensity;
        boxDef.friction = frictionCoefficient;
        boxDef.restitution = restitution;
        boxDef.filter.groupIndex = collisionGroup;
        boxDef.filter.categoryBits = static_cast<uint16_t>(myCategories);
        boxDef.filter.maskBits = static_cast<uint16_t>(collisionCategories);
        boxBody->CreateFixture(&boxDef);
        return boxBody;
    }

这将返回 nullptr。

b2Body* current = s_world->GetBodyList();

不确定这是否是所有相关信息,因为我对 Box2D 不是很了解。如有遗漏请告诉我。

【问题讨论】:

  • CreateBody 会将正文放入正文列表中。 GetBodyList 只是返回指向列表头部的指针。没什么特别的。你确定你对这两个东西使用相同的 s_world 指针吗?
  • 是的,所有的函数都是静态的并且使用相同的静态成员 s_world,即使在调用 CreateBody 之前和之后单步执行代码并查看 s_world 时,显示 m_bodylist 变量始终为 NULL。
  • 调试代码。只需走进图书馆,看看它做了什么。涉及的代码非常简单:github.com/erincatto/box2d/blob/master/src/dynamics/… CreateBody 位于第 115 行。如您所见,它确实将正文添加到列表前面的m_bodyList
  • 当前使用 Box2D 作为库,因此我无法单步执行代码,但在 CreateBody 调用之前和 CreateBody 调用之后,s_world 指针的 m_bodylist 变量读取为 NULL。这会让我觉得它没有添加变量,但返回的指针是一个有效的 b2Body 更新和碰撞。让我觉得 s_world 变量确实有这些机构。

标签: c++ box2d


【解决方案1】:

目前使用 Box2D 作为库,因此无法单步执行代码

这可能就是重点。

我遇到了同样的问题,我安装了 2 个版本的 Box2D。一个在系统中,一个在我的本地文件夹中。我链接到本地​​版本,但使用了系统头文件。 但是 GetBodyCount 函数是内联的,并且不知何故与链接的版本不匹配。

因此,请确保链接到您从中获取头文件的同一个库。 更改后我可以再次使用GetBodyCount()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2020-07-25
    • 2020-08-17
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多