首页 文章

在LibGDX中使用shapeRenderer绘制环

提问于
浏览
1

我想用shaperenderer绘制一个戒指(带有大边框的圆圈) .

我试过两种不同的解决方案

  • 解决方案:绘制n个圆圈,每个圆圈的宽度为1像素,比之前的像素宽1个像素 . 问题在于:它会产生图形故障 . (还具有不同的多重采样抗锯齿值)

  • 解决方案:绘制一个大的填充圆,然后用backgroundcolor绘制一个较小的圆 . 问题:我无法实现重叠的环形状 . 其他一切都很好 .

Problems with the solutions

我不能使用环形纹理,因为我必须增加/减少环形半径动态 . 边框宽度应始终具有相同的值 .

如何用shaperenderer绘制光滑的环?

编辑:增加行宽无济于事:
big width = also problem

3 回答

  • 1

    MeshBuilder 可以选择使用 ellipse 方法创建环 . 它允许您指定环的内部和外部大小 . 通常这会产生一个Mesh,您需要自己渲染 . 但由于最近的更改,它也可以与 PolygonSpriteBatchBatch 的实现一起使用,允许更灵活的形状,而 SpriteBatch 仅允许四边形)一起使用 . 您可以使用 PolygonSpriteBatch 而不是通常使用 SpriteBatch 的地方(例如,您的 StageSprite 类) .

    以下是如何使用它的示例:https://gist.github.com/xoppa/2978633678fa1c19cc47,但请记住,您确实需要最新的每晚(或至少发布1.6.4) .

  • 0

    也许你可以尝试以其他方式制作戒指,例如使用三角形 . 我不熟悉LibGDX,所以这里有一些伪代码 .

    // number of sectors in the ring, you may need
     // to adapt this value based on the desired size of
     // the ring
    int sectors=32;
    float outer=0.8; // distance to outer edge
    float inner=1.2; // distance to inner edge
    glBegin(GL_TRIANGLES)
    glNormal3f(0,0,1)
    for(int i=0;i<sectors;i++){
     // define each section of the ring 
     float angle=(i/sectors)*Math.PI*2
     float nextangle=((i+1)/sectors)*Math.PI*2
     float s=Math.sin(angle)
     float c=Math.cos(angle)
     float sn=Math.sin(nextangle)
     float cn=Math.cos(nextangle)
     glVertex3f(inner*c,inner*s,0)
     glVertex3f(outer*cn,outer*sn,0)
     glVertex3f(outer*c,outer*s,0)
    
     glVertex3f(inner*c,inner*s,0)
     glVertex3f(inner*cn,inner*sn,0)
     glVertex3f(outer*cn,outer*sn,0)
    }
    glEnd()
    

    或者,将环分成四个多边形,每个多边形由整个环的四分之一组成 . 然后使用ShapeRenderer填充这些多边形 .

    以下是如何划分戒指的说明:

    enter image description here

  • 1

    如果我理解你的问题,也许,使用 glLineWidth(); 帮助你 .

    示例伪代码:

    size = 5;
    
    Gdx.gl.glLineWidth(size);
    
    mShapeRenderer.begin(....);
    ..//
    mShapeRenderer.end();
    

相关问题