镜像Box2D形状

时间:2013-12-09 23:05:26

标签: box2d box2d-iphone

我使用以下代码翻转形状。当我翻转x y时,会看到形状被翻转。

b2FixtureDef fixd = fix->fixture;
const b2Shape *shape = fixd.shape;
if(shape->GetType()== b2Shape::e_polygon && flip)
{
        b2PolygonShape* ps = (b2PolygonShape*)shape;
        for(int i=0;i<ps->m_vertexCount;i++)
        {
            ps->m_vertices[i].x *= -1;
            //ps->m_vertices[i].y *= -1; // causing assert later
        }

        // revert the vertices
        b2Vec2* reVert = new b2Vec2[ps->m_vertexCount];
        int j = ps->m_vertexCount -1;
        for(int i=0; i<ps->m_vertexCount;i++)
            reVert[i] = ps->m_vertices[j--];

        ps->Set(&reVert[0], ps->m_vertexCount);
        body->CreateFixture(ps, 1.0f);
}

但如果我将xy翻转在一起,我会得到一个断言b2PolygonShape.cpp,因为区域是负数。

// Centroid
b2Assert(area > b2_epsilon);

我不确定如何翻转xy。我需要反映形状,Box2D论坛说

  

要镜像多边形,请镜像每个顶点,然后按顺序反转   顶点。我已经在考虑为此添加一种方法。

2 个答案:

答案 0 :(得分:2)

如果你翻转x和y轴,那么你不需要颠倒顶点的顺序。

以这种方式思考......如果你翻过两个轴,那么你基本上是在x轴和y轴上翻转。如果每次翻转一个轴时都反转顶点,那么你已经将顶点反转了两次,最终得到了与开始时相同的顺序。

答案 1 :(得分:0)

在版本2.3.0之前,Box2d需要所有顶点的逆时针缠绕顺序。

当您镜像顶点时,您正在反转绕组的顺序。

我相信这已在2.3.0中得到纠正(见here)。因此,我相信您可以(1)在镜像后反转订单或(2)升级到最新版本的Box2d。

对于选项1,例如,我之前使用多边形创建了一个正方形(对于此project

   // Main Box
   vertices.clear();
   vertices.push_back(Vec2(1*VERT_SCALE,1*VERT_SCALE));
   vertices.push_back(Vec2(-1*VERT_SCALE,1*VERT_SCALE));
   vertices.push_back(Vec2(-1*VERT_SCALE,-1*VERT_SCALE));
   vertices.push_back(Vec2(1*VERT_SCALE,-1*VERT_SCALE));
   polyShape.Set(&vertices[0],vertices.size());
   _body->CreateFixture(&fixtureDef);

顶点按(1,1),( - 1,1),( - 1,-1),(1,-1)的顺序排列。 或者:右上,左上,左下,右下。

这是逆时针顺序。

如果你反映这些,你得到: 左上角,右上角,右下角,左下角

这是顺时针顺序。

如果你反转它们,你会得到:

左下,右下,右上,左上

我认为这是顺时针方向。我相信(但我不确定......咖啡还不够),这适用于任何凸多边形。

注意我使用std :: vector作为顶点。您可以使用this撤消它。

这有用吗?