gpt4 book ai didi

c++ - Box2d - 从 body 获取夹具的宽度还是我应该尝试?

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:27 27 4
gpt4 key购买 nike

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

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

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)

关于c++ - Box2d - 从 body 获取夹具的宽度还是我应该尝试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42630457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com