在 LibGDX 中使用 shapeRenderer 绘制环

Draw Ring with shapeRenderer in LibGDX

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

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

  1. 解法:画n个圆,每一个宽1个像素,比前一个大1个像素。问题在于:它会产生图形故障。 (也具有不同的多重采样抗锯齿值)

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

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

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

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

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

示例伪代码:

size = 5;

Gdx.gl.glLineWidth(size);

mShapeRenderer.begin(....);
..//
mShapeRenderer.end();

也许你可以尝试用其他方式制作戒指,比如使用三角形。我对 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 来填充这些多边形中的每一个。

下面是如何划分戒指的示例:

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

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