【发布时间】: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 变量确实有这些机构。