为什么 Pyglet 不能正确绘制多边形?

Why can't Pyglet draw a polygon correctly?

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

这是结果,但它应该像我在下面绘制的绿色多边形。

PyGlet is a OpenGL wrapper. Polygones which are drawn with the Legacy OpenGL Primitive type GL_POLYGON have to be 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:


对于任何要绘制的多边形,您都必须找到合适的 Polygon triangulation。三角剖分可能会有所不同,必须使用 Triangle primitive 类型 GL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN 之一。

在某些情况下,更改多边形的起点并使用基元类型就足够了 GL_TRIANGLE_FAN

例如点列表(来自 commnet)[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 算法,例如 双耳定理 ,但 OpenGL 不会为您完成这项工作。