Box2D-从身体中获取固定装置的宽度,或者我什至应该尝试

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

本文关键字:或者 获取 装置 Box2D-      更新时间:2023-10-16

我已经阅读了一些有关此的线程,但是它们看起来并不清楚。因此,如何找到一个固定装置的宽度?我知道可以访问固定装置及其所有这些,但对最后一部分并不了解。尤其是,我不知道如何以最有效的方式执行此操作,如果您实际上最好将float变量作为身体的用户data进行。

谢谢,非常感谢!

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

1)将形状连接到固定装置,然后使用形状值。无需以这种方式访问宽度,因为您将是定义它的人。理想情况下的大小应该是您班上的成员。

例如:

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);

从那时起,您可以使用类成员来访问位置和大小。如果我知道每个对象(播放器)应该在场景中,那就是我要使用的方法。

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)中找到此信息