libgdx 识别png图片轮廓,得到多边形数组,生成刚体

private Array<Vector2> makePoly(Texture texture, int d, int angle) {
        Array<Vector2> points = new Array<Vector2>();

        int w = texture.getWidth();
        int h = texture.getHeight();
        texture.getTextureData().prepare();
        Pixmap spr = texture.getTextureData().consumePixmap();

        // increase array size from 255 if needed
        int[] vertex_x = new int[255 * 4], vertex_y = new int[255 * 4], vertex_k = new int[255 * 4];

        int numPoints = 0, tx = 0, ty = 0, fy = -1, lx = 0, ly = 0;
        vertex_x[0] = 0;
        vertex_y[0] = 0;
        vertex_k[0] = 1;
        for (tx = 0; tx < w; tx += d)
            for (ty = 0; ty < h; ty += 1)
                if ((spr.getPixel(tx, ty) >> 24) != 0x00) {
                    vertex_x[numPoints] = tx;
                    vertex_y[numPoints] = h - ty;
                    vertex_k[numPoints] = 1;
                    numPoints++;
                    if (fy < 0) fy = ty;
                    lx = tx;
                    ly = ty;
                    break;
                }
        for (ty = 0; ty < h; ty += d)
            for (tx = w - 1; tx >= 0; tx -= 1)
                if ((spr.getPixel(tx, ty) >> 24) != 0x00 && ty > ly) {
                    vertex_x[numPoints] = tx;
                    vertex_y[numPoints] = h - ty;
                    vertex_k[numPoints] = 1;
                    numPoints++;
                    lx = tx;
                    ly = ty;
                    break;
                }
        for (tx = w - 1; tx >= 0; tx -= d)
            for (ty = h - 1; ty >= 0; ty -= 1)
                if ((spr.getPixel(tx, ty) >> 24) != 0x00 && tx < lx) {
                    vertex_x[numPoints] = tx;
                    vertex_y[numPoints] = h - ty;
                    vertex_k[numPoints] = 1;
                    numPoints++;
                    lx = tx;
                    ly = ty;
                    break;
                }
        for (ty = h - 1; ty >= 0; ty -= d)
            for (tx = 0; tx < w; tx += 1)
                if ((spr.getPixel(tx, ty) >> 24) != 0x00 && ty < ly && ty > fy) {
                    vertex_x[numPoints] = tx;
                    vertex_y[numPoints] = h - ty;
                    vertex_k[numPoints] = 1;
                    numPoints++;
                    lx = tx;
                    ly = ty;
                    break;
                }
        double ang1, ang2;
        for (int i = 0; i < numPoints - 2; i++) {
            ang1 = PointDirection(vertex_x[i], vertex_y[i], vertex_x[i + 1], vertex_y[i + 1]);
            ang2 = PointDirection(vertex_x[i + 1], vertex_y[i + 1], vertex_x[i + 2], vertex_y[i + 2]);
            if (Math.abs(ang1 - ang2) <= angle) vertex_k[i + 1] = 0;
        }
        ang1 = PointDirection(vertex_x[numPoints - 2], vertex_y[numPoints - 2], vertex_x[numPoints - 1], vertex_y[numPoints - 1]);
        ang2 = PointDirection(vertex_x[numPoints - 1], vertex_y[numPoints - 1], vertex_x[0], vertex_y[0]);
        if (Math.abs(ang1 - ang2) <= angle) vertex_k[numPoints - 1] = 0;
        ang1 = PointDirection(vertex_x[numPoints - 1], vertex_y[numPoints - 1], vertex_x[0], vertex_y[0]);
        ang2 = PointDirection(vertex_x[0], vertex_y[0], vertex_x[1], vertex_y[1]);
        if (Math.abs(ang1 - ang2) <= angle) vertex_k[0] = 0;
        /*int n=0;
        for (int i=0;i<numPoints;i++)
            if(vertex_k[i]==1)n++;
        */
        for (int i = 0; i < numPoints; i++)
            if (vertex_k[i] == 1) {
                Vector2 point = new Vector2();
                point.set(vertex_x[i], h - vertex_y[i]);
                points.add(point);
            }

        texture.getTextureData().disposePixmap();

        return points;
    }

    double PointDirection(double xfrom, double yfrom, double xto, double yto) {
        return Math.atan2(yto - yfrom, xto - xfrom) * 180 / Math.PI;
    }


使用:

BodyDef bodyDef = new BodyDef();
            bodyDef.type = BodyDef.BodyType.StaticBody;
            bodyDef.position.set(item.getX() - image.getWidth() / 2f, item.getY() - image.getHeight() / 2f);

            //Body body = peReader.createBody(item.getName2(), world, bodyDef, 1, 1);
            Array<Vector2> points = makePoly(Maker.getTexture("road1/" + item.getName2() + "" +
                    ".png"), 2, 50);

            Body body = world.createBody(bodyDef);
            LogHelper.log(points.size);
            if (points.size >= 3 && points.size <= 8) {
                PolygonShape polygonShape = new PolygonShape();
                polygonShape.set((Vector2[]) points.toArray(Vector2.class));


                FixtureDef fixtureDef = new FixtureDef();
                fixtureDef.shape = polygonShape;

                body.createFixture(fixtureDef);
            }

效果图:


猜你喜欢

转载自blog.csdn.net/qq634416025/article/details/52100986