首页 > 解决方案 > cocos2d-x]在box2d中,没有正确地用顶点制作多边形

问题描述

        {
            b2BodyDef bodyDef;
            bodyDef.type = b2_staticBody;
            bodyDef.position.Set(location.x / PTM_RATIO, location.y / PTM_RATIO);
            bodyDef.userData = pSprite;
            //bodyDef.userData = nullptr;

            b2Body* body = _world->CreateBody(&bodyDef);
            body->SetLinearVelocity(b2Vec2(1, 0));

            b2PolygonShape poly;

            b2Vec2 vertices[7];
            vertices[0].Set(0, 0);
            vertices[1].Set(1, 0);
            vertices[2].Set(1, 1);
            vertices[3].Set(0.75f, 1);
            vertices[4].Set(0.5f, 1.5f);
            vertices[5].Set(0.25f, 1);
            vertices[6].Set(0, 1);
            poly.Set(vertices, 7);

            b2FixtureDef fixtureDef;

            fixtureDef.shape = &poly;
            fixtureDef.density = 1.0f;
            fixtureDef.friction = 0.5f;
            fixtureDef.restitution = 0.0f;
            body->CreateFixture(&fixtureDef);
        }

我用顶点值制作box2d的身体。

在此处输入图像描述 在代码中,我的顶点形状就像上图。

(它使用的是 b2ChainShape,所以内部是空的)

在此处输入图像描述 但做出的体型就是这样。

为什么会出现这些差异?

我不能解决这个问题吗?

标签: c++cocos2d-xbox2d

解决方案


b2PolygonShape不能用于凹多边形;它仅适用于凸多边形

的实现b2PolygonShape使用凸包计算算法,它将点集从您想要的(如您的第一张图像所示)变为您得到的(如您的第二张图像所示)。

这被列为一个常见错误:使用b2Polygon创建凹多边形。

您可以使用b2ChainShape您引用的 a 。

如果内部区域为空不是您想要的,您可以使用一组凸多边形构建凹形。

只需两个凸多边形就足以创建您显示的第一个形状。这些凸多边形之一是三角形,另一个是矩形(或正方形)。

希望这可以帮助。


推荐阅读