【问题标题】:Mirroring Box2D shape镜像 Box2D 形状
【发布时间】:2013-12-09 23:05:25
【问题描述】:

我使用以下代码来翻转形状。当我沿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 论坛说

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

【问题讨论】:

  • 你有没有想出某种类/库/代码,以便任何人都可以使用它,而不必重新发明轮子......

标签: box2d box2d-iphone


【解决方案1】:

如果同时翻转 x 轴和 y 轴,则不需要颠倒顶点的顺序。

这样想...如果您在两个轴上翻转,那么您基本上是在 x 轴和 y 轴上翻转。如果每次翻转轴时都反转顶点,那么您已经反转了两次顶点,最终得到的顺序与开始时相同。

【讨论】:

  • 即使我不倒车我也应该做ps-&gt;Set吗?
【解决方案2】:

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

当您镜像顶点时,您正在颠倒缠绕的顺序。

我相信这已在 2.3.0 中得到纠正(请参阅 here)。因此,我相信您可以(1)在镜像它们后反转顺序或(2)升级到最新版本的 Box2d。

例如,对于选项 1,我之前使用 polyshape 创建了一个正方形(为此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 将其反转。

这有帮助吗?

【讨论】:

  • 我想坚持使用 2.2.1。所以上面的代码在我镜像顶点后颠倒了顺序。但在那之后有一个断言。您能否澄清选项(1)?也许根据您的建议提供一些代码 sn-p。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
相关资源
最近更新 更多