在LibGDX中使用shapeRenderer绘制环

时间:2015-07-02 13:56:52

标签: opengl libgdx shape

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

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

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

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

  3. Problems with the solutions

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

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

    编辑: 增加行宽并没有帮助: big width = also problem

3 个答案:

答案 0 :(得分:1)

也许您可以尝试以其他方式制作戒指,例如使用三角形。我对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 :(得分:1)

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

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

答案 2 :(得分:0)

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

示例伪代码:

size = 5;

Gdx.gl.glLineWidth(size);

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