Box2d - 从 body 获取固定装置的宽度,或者我应该尝试一下吗?

Box2d - Get width of fixture from a body or should I even try?

我已经阅读了一些关于此的主题,但它们看起来并不十分清楚。 因此.. 如何找到一个夹具的宽度?我知道访问固定装置和所有这些很热,但对最后一部分并不真正了解。特别是,我不知道如何以最有效的方式执行此操作,如果您真的最好将 float 变量存储为 body.

的 userData

谢谢,非常感谢!

您可以通过 2 种方法完成此任务:

1) 将形状附加到夹具,然后使用形状值。无需以这种方式访问​​宽度,因为您将是定义它的人。理想情况下,尺寸应该是 class.

中的成员

例如:

struct Player
{
    vec2 m_position;
    vec2 m_size;
    std::unique_ptr<b2Body> m_body;

    Player( const vec2 &pos_  = {0.f,0.f},
            const vec2 &size_ = {1.f,1.f} )
            : 
            m_position(pos_),
            m_size(size_),
            m_body(nullptr)
    {;}
};


// In your code...
std::unique_ptr<Player> m_player{ new Player({0.f,0.f},{3.f,2.f}) };  // make_unique if in C++14
b2World *m_world = new b2World(b2Vec2(0.f, -9.81f));  // use smart ptr here too..
b2BodyDef bodyDefinition;
b2PolygonShape bodyShape;
b2FixtureDef bodyFixture;

// PLAYER BODY DEFINITION
bodyDefinition.type = b2_dynamicBody;

// PLAYER SHAPE
bodyShape.SetAsBox(m_player->m_size.x, m_player->m_size.y);

// PLAYER FIXTURE
bodyFixture.shape = &bodyShape;

// PLAYER BIND TO THE WORLD
m_player->m_body.reset( m_world->CreateBody(&bodyDefinition) ); // or you can use the b2Body::CreateBody factory function. Then use b2Body::DestroyBody to delete the object.
m_player->m_body->SetActive(true);
m_player->m_body->CreateFixture(&bodyFixture);

从那时起,您可以使用 class 成员访问位置和尺寸。如果我知道场景中的每个对象(玩家)应该是什么,我就会采用这种方法。

2) 如果你遇到的情况是你不在初始化时定义大小,那么你需要围绕形状创建一个 AABB,然后从那里,你可以根据 AABB 的最小值和最大值计算大小。如果对象旋转,则需要计算 OBB。

例如:

m_player->m_body->SetTransform(m_player->m_position,0.f);
b2AABB aabb;
bodyShape.ComputeAABB(&aabb,m_player->m_body->GetTransform(),0);

Center = m_player->m_body->GetFixtureList()->GetAABB(0).GetCenter();
LowerBound = m_player->m_body->GetFixtureList()->GetAABB(0).lowerBound;
HigherBound = m_player->m_body->GetFixtureList()->GetAABB(0).lowerBound;

然后使用此信息计算宽度。

此信息来自 Box2d 文档 (http://box2d.org/manual.pdf)