我正在随机创建点以用于使用Pyglet绘制多边形。但是Pyglet大部分时间都做不正确。
好吧,我尝试用另一个图形模块绘制一个多边形,但实际上它可以工作,但是如果Pyglet可以正常工作,那将使我的工作更加轻松。
我用它来绘制多边形和点(以便于您查看)。
point_list = [18, 61, 59, 149, 328, 204, 305, 284, 3, 197, 25, 107]
ec = int(len(point_list)/2)
batch.add(ec, pyglet.gl.GL_POLYGON, None, ("v2i", point_list), ("c3B", [random.randrange(255)]*(3*ec)))
for i in range(int(len(point_list)/2)):
p1 = point_list[i*2:2+i*2]
p2 = point_list[2+i*2:4+i*2]
if not len(p2):
p2 = point_list[:2]
batch.add(ec, pyglet.gl.GL_POINTS, None, ("v2i", point_list), ("c3B", [255]*(3*ec)))
@window.event
def on_draw():
window.clear()
batch.draw()
pyglet.app.run()
答案 0 :(得分:2)
PyGlet是OpenGL包装器。使用Legacy OpenGL Primitive类型GL_POLYGON
绘制的多边形必须为Convex。 Concave多边形可能无法正确绘制。
使用基本类型GL_TRIANGLE_FAN
,然后从点(59,149)开始。这将在您的特殊情况下解决此问题:
point_list = [59, 149, 328, 204, 305, 284, 3, 197, 25, 107, 18, 61]
ec = int(len(point_list)/2)
batch.add(ec, pyglet.gl.GL_TRIANGLE_FAN, None,
("v2i", point_list),
("c3B", [random.randrange(255)]*(3*ec)))
对于要绘制的任何多边形,必须找到合适的Polygon triangulation。三角剖分可能会有所不同,并且必须使用Triangle primitive类型GL_TRIANGLES
,GL_TRIANGLE_STRIP
或GL_TRIANGLE_FAN
中的一种。
在某些情况下,更改多边形的起点并使用基本类型GL_TRIANGLE_FAN
就足够了。
例如点列表(来自通讯网)[488, 485, 375, 73, 61, 48, 70, 257, 119, 260, 418, 327]
可以更改为[375, 73, 61, 48, 70, 257, 119, 260, 418, 327, 488, 485]
:
对于更通用的方法,您必须实现Polygon triangulation之类的Two ears theorem算法,但是OpenGL不能为您完成这项工作。