为什么Pyglet无法正确绘制多边形?

时间:2019-07-28 09:40:57

标签: python python-3.x opengl pyglet opengl-compat

我正在随机创建点以用于使用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()

actual result

这是结果,但它应类似于我在下面绘制的绿色多边形。 wrong and correct

1 个答案:

答案 0 :(得分:2)

PyGlet是OpenGL包装器。使用Legacy OpenGL Primitive类型GL_POLYGON绘制的多边形必须为ConvexConcave多边形可能无法正确绘制。


使用基本类型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


对于要绘制的任何多边形,必须找到合适的Polygon triangulation。三角剖分可能会有所不同,并且必须使用Triangle primitive类型GL_TRIANGLESGL_TRIANGLE_STRIPGL_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]

enter image description here


对于更通用的方法,您必须实现Polygon triangulation之类的Two ears theorem算法,但是OpenGL不能为您完成这项工作。