C++ 如何在Box2D中设置形状/装置/实体的中心

C++ 如何在Box2D中设置形状/装置/实体的中心,c++,object,center,box2d,centering,C++,Object,Center,Box2d,Centering,嘿,我正在尝试集成SFML和Box2D,SFML使精灵、形状等的设置中心变得非常简单。另一方面,Box2D,我遇到了问题,因为我不知道如何设置,甚至找不到形状或夹具的中心 在我看来,当手动将顶点添加到b2_多边形形状时,中心被设置为顶点数组中的第一个顶点,但使用快捷方式函数SetAsBox()或任何其他SetAs_;()时,结果非常不同。中心是形状的中间,或长方体/形状的一半范围 我需要将box2D和SFML的定心系统通用化,但我无法理解局部坐标系如何适用于对象 如何在Box2D中设置/获取许多

嘿,我正在尝试集成SFML和Box2D,SFML使精灵、形状等的设置中心变得非常简单。另一方面,Box2D,我遇到了问题,因为我不知道如何设置,甚至找不到形状或夹具的中心

在我看来,当手动将顶点添加到b2_多边形形状时,中心被设置为顶点数组中的第一个顶点,但使用快捷方式函数SetAsBox()或任何其他SetAs_;()时,结果非常不同。中心是形状的中间,或长方体/形状的一半范围

我需要将box2D和SFML的定心系统通用化,但我无法理解局部坐标系如何适用于对象


如何在Box2D中设置/获取许多对象(如形状、固定装置、实体等)的中心?

您只需执行以下操作:

b2Body *body = ...;
b2Vec2 pos = body->GetPosition();
这是身体在世界上的位置(
pos.x
pos.y
,以米为单位定义)。 这意味着您必须使用一个比率,例如:1米=20像素。所以你必须把坐标乘以你的比率,才能得到以像素为单位的位置

使用该位置绘制图像。如果需要,可以向图像添加坐标,并在这些坐标上绘制相对于身体位置的图像

请记住,你必须画你的图像以及与该比率。当比率改变(放大或缩小)时,图像也应放大


在我的游戏中,我使用SDL和OpenGL,这是一个非常好的组合,所以我不知道SFML是如何工作的。

我认为使用box2d,你有责任使多边形的“质心”与你身体的位置一致。 基本上你要做的就是这样

  • 计算顶点列表的质心(b2vec)

  • 按-质心移动顶点

Box2d提供了必要的功能来帮助您完成此任务。
SetAs_uuuuu的情况是,质心是(0,0),多边形是围绕身体中心对称创建的。

我会再试一次。我很确定我能帮你,但我不完全理解你的问题

身体在世界上有一个位置(
b2Vec2
)。
一个物体具有
b2夹具
s(密度、摩擦、恢复、形状等)
b2PolygonShape
具有顶点和质量数据。这些顶点是相对于身体位置的

b2PolgygonShape的顶点示例(矩形,大小:1米*1米)

请记住,您不能自己设置顶点!你必须把它们传给我

b2PolgygonShape::Set(b2Vec2 *vertices, int count);

此方法将根据顶点计算大量数据。

好的,我意识到SFML和Box2D实际上没有那么大的不同,但我只是没有考虑如何在世界坐标系中正确制作/渲染形状

除非另有规定,否则在移动/绘制对象位置时,(0,0)始终用作对象的参考点/中心,并且每个顶点都是相对于该点绘制的。


SFML教程有点让人困惑,因为它说设置形状/精灵的中心是从对象左上角的偏移量,而不是(0,0)

这可能是相关的,尽管我使用的是Box2DWeb和Easel.js,而不是Box2D和SFML。 我遇到的问题是,Easel.js regX/regY(精灵的图形中心)需要与物理质心匹配

对于带有一个b2FixtureDef的简单b2Body,body的质心与b2FixtureDef.shape的m_形心重合(无论是SetAsBox、SetAsArray、新b2CircleShape等)

对于多装置实体和不规则多边形,对我有效的方法是添加所有装置(即调用b2Body.CreateFixture),然后将图形regX/regY设置为等于b2Body.m_sweep.localCenter.x/y(乘以像素/米比例因子)


这对简单的圆圈和方框不起作用,但它们一开始就不是问题。希望这有帮助。

你说的身体中心是什么意思?质心?在全球、世界坐标系中用于定位的中心。不是我假设用来在身体上定位固定点的局部身体坐标系。我说的是局部中心,它通过在局部中心周围绘制所有顶点来影响全局坐标。谢谢你的尝试,但我找到了它!我的问题有点让人困惑,但我发现无论在全局、世界坐标中渲染形状时使用什么0,0作为参照点。我就知道最后会很明显!
b2PolgygonShape::Set(b2Vec2 *vertices, int count);