如何在Box2D中设置形状/夹具/主体的中心

时间:2011-07-08 07:18:47

标签: c++ object center box2d centering

嘿,我正在尝试集成SFML和Box2D,而SFML已经为精灵,形状等设置中心非常容易。 Box2D,另一方面,我遇到了麻烦,因为我无法弄清楚如何设置甚至找到形状或夹具的中心。

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

我需要统一box2D和SFML的居中系统,但我无法弄清楚局部坐标系如何为物体工作。

如何在Box2D中设置/获取形状,固定装置,身体等许多物体的中心?

5 个答案:

答案 0 :(得分:4)

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

除非另有说明,否则(0,0)总是用作对象的参考点/中心,当它的位置被移动/绘制时,每个顶点都是相对于该点绘制的。

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

答案 1 :(得分:2)

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

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

  • 通过-centroid移动顶点。

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

答案 2 :(得分:1)

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

身体在世界上有一个位置(b2Vec2) 身体有b2Fixture s(密度,摩擦力,恢复原状,形状等)...... b2PolygonShape包含顶点和海量数据。那些顶点相对于身体位置。

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

(-0.5f, -0.5f)  // left  upper corner
( 0.5f, -0.5f)  // right upper corner
( 0.5f,  0.5f)  // right lower corner
(-0.5f,  0.5f)  // left  lower corner

请注意,无法自行设置顶点!你必须将它们传递给

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

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

答案 3 :(得分:0)

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

对于一个带有一个b2FixtureDef的简单b2Body,正文的质心与b2FixtureDef.shape的m_centroid一致(无论是SetAsBox,SetAsArray,新的b2CircleShape等)。

对于多夹具体和不规则多边形,对我来说有用的是添加所有夹具(即调用b2Body.CreateFixture),然后将图形regX / regY设置为等于b2Body.m_sweep.localCenter.x / y(相乘)按像素/米比例因子)。

这对简单的圆圈和方框不起作用,但它们首先不是问题。希望这会有所帮助。

答案 4 :(得分:-1)

你可以这样做:

b2Body *body = ...;
b2Vec2 pos = body->GetPosition();

这是世界上的身体姿势(pos.xpos.y,以米为单位)。 这意味着您必须使用比率,例如:1米= 20像素。因此,您必须将坐标乘以您的比率以获得以像素为单位的位置。

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

请注意,您必须使用该比例绘制图像。当比例改变(放大或缩小)时,图像也应该放大。

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