在 LibGDX 中使用 shapeRenderer 绘制环
Draw Ring with shapeRenderer in LibGDX
我想用 shaperenderer 画一个圆环(大边框的圆)。
我尝试了两种不同的解决方案:
解法:画n个圆,每一个宽1个像素,比前一个大1个像素。问题在于:它会产生图形故障。 (也具有不同的多重采样抗锯齿值)
解决方法:先画一个大的实心圆,然后再画一个小一点的背景色。问题:我无法实现重叠的环形。其他一切正常。
我不能使用环形纹理,因为我必须 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
的地方(例如,对于您的 Stage
或 Sprite
class)。
这是一个如何使用它的示例:https://gist.github.com/xoppa/2978633678fa1c19cc47,但请记住,您确实需要最新的 nightly(或至少是 1.6.4 版)。
我想用 shaperenderer 画一个圆环(大边框的圆)。
我尝试了两种不同的解决方案:
解法:画n个圆,每一个宽1个像素,比前一个大1个像素。问题在于:它会产生图形故障。 (也具有不同的多重采样抗锯齿值)
解决方法:先画一个大的实心圆,然后再画一个小一点的背景色。问题:我无法实现重叠的环形。其他一切正常。
我不能使用环形纹理,因为我必须 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
的地方(例如,对于您的 Stage
或 Sprite
class)。
这是一个如何使用它的示例:https://gist.github.com/xoppa/2978633678fa1c19cc47,但请记住,您确实需要最新的 nightly(或至少是 1.6.4 版)。