1

我正在尝试在 Box2D 中创建一个“块”系统 - 即连接在一起形成一个大块的形状,这样你就可以将块分成它们自己的身体。

目前,我的系统非常基础(才真正开始),并以 Box2D 测试平台中的“Breakable”测试为模型。它是一个带有很多基本盒子固定装置(稍后将变成多边形)的主体。当您单击一个实体时,它会删除夹具并在与旧“块”相同的位置创建一个具有相同夹具、旋转等的新实体。

但是,我只能让它在大身体的原点
(-> GetWorldCenter)创建新身体。我想做的是找到要删除和替换的灯具的全局位置,这样我就可以在那里制作新的块。

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

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

4

1 回答 1

1

对于 Box2D 身体的位置不是那么重要。身体位置只是夹具坐标的偏移。它不影响模拟过程。所以,我不明白,你为什么这么关心这个。

我做了这样的事情,可以说,使用大身体的起源很好。您可以查看 Box2D 测试平台到 Breakable 测试。还有用大身躯的本源。我看到的计算新坐标的唯一原因是 SetAngle 方法的奇怪行为。

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

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

ps不要忘记转换多边形点,当你将创建新的身体。只需找到大体和新体之间的差异,然后从多边形的每个点中减去它。

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;
}
于 2012-10-23T19:36:30.193 回答