在Box2D中找到夹具的中心

时间:2012-09-12 19:40:26

标签: c++ box2d

我正在尝试在Box2D中制作一个“块状”系统 - 即形状以大块状结合在一起,这样你就可以将块状物分解成自己的身体。

目前,我的系统非常基本(刚刚开始),并在Box2D测试平台的“Breakable”测试之后建模。它是一个有很多基本盒子装置的体(后来会变成多边形)。单击一个实体时,它会删除夹具并在与旧“块”相同的位置创建一个具有相同夹具,旋转等的新实体。

然而,我只能在大身体的起源处创造新身体 ( - > GetWorldCenter)。我想要做的是找到要删除和替换的灯具的全局位置,这样我就可以在那里制作新的块。

我读过一些关于b2PolygonShape有一个“质心”的东西,但我不知道如何访问和使用它......

简单来说,我想找到FIXTURE的全局位置(如x + y或b2Vec2),而不是身体(这很容易)。灯具会随着它所附着的身体移动,但我目前只需要一帧的位置(虽然更新它也很有用)。

1 个答案:

答案 0 :(得分:1)

对于Box2D身体的位置并不那么重要。主体位置仅适用于夹具坐标。它不会影响模拟过程。所以,我不明白,为什么你这么关心这个。

我做了这样的事情,并且可以说,使用大身体的起源可以正常工作。你可以看到Box2D testbed到Breakable测试。还有大身体的起源。我只看到计算新坐标的原因是SetAngle方法的奇怪行为。

如果您仍想要质心,请查看位于b2PolygonShape.cpp的ComputeCentroid。注意,方法不要在b2PolygonShape.h中声明。您可以从cpp复制代码并像这样使用它:

b2Fixture* chunk = ...;
b2Vec2 chunkCentroidLocal = ComputeCentorid(chunk->m_vertices, 
    chunk->m_vertexCount);
b2Vec2 chunkCentroidWorld = bigBody->GetWorldPoint(chunkCentroidLocal);

P.S。在创建新体时,不要忘记变换多边形点。只需找到大体和新体之间的差异,然后从多边形的每个点中减去它。

b2Vec2 shift = chunkCentroidWorld - bigBody->GetWorldCenter();
b2Vec2 newVertices = new b2Vec2[chunk->m_vertexCount];
for(int i = 0; i< chunk->m_vertexCount; i++)
{
   newVertices[i] = chunk->m_vertices[i] - shift;
}