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

2024-03-21

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

This is the result but it should be like the green colored polygon I drew below. wrong and correct


PyGlet https://pyglet.readthedocs.io/en/pyglet-1.3-maintenance/programming_guide/graphics.html是一个 OpenGL 包装器。用 绘制的多边形旧版 OpenGL https://www.khronos.org/opengl/wiki/Legacy_OpenGL 原始 https://www.khronos.org/opengl/wiki/Primitive type GL_POLYGON不得不Convex https://en.wikipedia.org/wiki/Convex_polygon. Concave https://en.wikipedia.org/wiki/Concave_polygon多边形可能无法正确绘制。


使用原始类型GL_TRIANGLE_FAN https://www.khronos.org/opengl/wiki/Primitive#Triangle_primitives并从点 (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)))

这会导致这个多边形三角剖分 https://en.wikipedia.org/wiki/Polygon_triangulation:


对于你想要绘制的任何多边形,你必须找到一个合适的多边形三角剖分 https://en.wikipedia.org/wiki/Polygon_triangulation。三角测量可以变化,其中之一基本三角形 https://www.khronos.org/opengl/wiki/Primitive#Triangle_primitives types GL_TRIANGLES, GL_TRIANGLE_STRIP or GL_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]:


对于更通用的方法,您必须实施多边形三角剖分 https://en.wikipedia.org/wiki/Polygon_triangulation像这样的算法两只耳朵定理 https://en.wikipedia.org/wiki/Two_ears_theorem,但 OpenGL 无法为您完成这项工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Pyglet 不能正确绘制多边形? 的相关文章

随机推荐