我使用以下代码翻转形状。当我翻转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);
}
但如果我将x
和y
翻转在一起,我会得到一个断言b2PolygonShape.cpp,因为区域是负数。
// Centroid
b2Assert(area > b2_epsilon);
我不确定如何翻转x
和y
。我需要反映形状,Box2D论坛说
要镜像多边形,请镜像每个顶点,然后按顺序反转 顶点。我已经在考虑为此添加一种方法。
答案 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撤消它。
这有用吗?