【问题标题】:Draw Ring with shapeRenderer in LibGDX在 LibGDX 中使用 shapeRenderer 绘制环
【发布时间】:2015-07-02 13:56:51
【问题描述】:

我想用 shaperenderer 画一个圆环(带大边框的圆)。

我尝试了两种不同的解决方案:

  1. 解决方案:画n个圆,每个圆宽1个像素,比前一个大1个像素。问题在于:它会产生图形故障。 (也具有不同的 Multisample Anti-Aliasing 值)

  2. 解决方法:画一个大的实心圆,然后用背景色画一个小一点的圆。问题:我无法实现重叠的环形状。其他一切正常。

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

如何使用 shaperenderer 绘制平滑的环?

编辑: 增加线宽无济于事:

【问题讨论】:

    标签: opengl libgdx shape


    【解决方案1】:

    MeshBuilder 可以选择使用ellipse 方法创建环。它允许您指定环的内部和外部尺寸。通常这会产生一个网格,您需要自己渲染它。但是由于最近的更改,它也可以与PolygonSpriteBatch 结合使用(Batch 的实现允许更灵活的形状,而SpriteBatch 只允许四边形)。您可以使用 PolygonSpriteBatch 代替通常使用 SpriteBatch 的位置(例如,用于您的 StageSprite 类)。

    这是一个如何使用它的示例:https://gist.github.com/xoppa/2978633678fa1c19cc47,但请记住,您确实需要最新的 nightly(或至少 1.6.4 版)。

    【讨论】:

    • 抱歉这么晚才回复。我试过你的例子,但只是用两个按钮得到一个黑屏。我正在使用 libgdx 1.7.0。你有什么线索吗?
    • 对我来说运行良好(我最近每晚都在),请参阅i.imgur.com/s7iQc6x.png。也许使用设置实用程序创建一个新项目,并确保复制粘贴代码完全一样。
    【解决方案2】:

    也许您可以尝试用其他方式制作戒指,例如使用三角形。我对 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 填充每个多边形。

    下面是如何划分圆环的说明:

    【讨论】:

    • 谢谢,我会试试的:)
    【解决方案3】:

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

    示例伪代码:

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

    【讨论】:

    • 增加线宽并没有帮助(请参阅我编辑的带有图片的帖子)。我还读到,并非每个 GL 驱动程序都支持 lineWidth...
    猜你喜欢
    • 2013-01-19
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多