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