为什么 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_TRIANGLES
、GL_TRIANGLE_STRIP
或 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]
:
对于更通用的方法,您必须实现 Polygon triangulation 算法,例如 双耳定理 ,但 OpenGL 不会为您完成这项工作。
我正在随机创建用于使用 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_TRIANGLES
、GL_TRIANGLE_STRIP
或 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]
:
对于更通用的方法,您必须实现 Polygon triangulation 算法,例如 双耳定理 ,但 OpenGL 不会为您完成这项工作。