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 无法为您完成这项工作。