使用Pyglet和GL_LINE_LOOP进行网格化

时间:2017-04-24 15:03:58

标签: python-3.x opengl pyglet

我尝试使用GL_LINE_LOOP在pyglet中创建网格。但是,我遇到了顶点序列的问题。

一个矩形工作正常:

One Rectangle works fine

当col超过1时,它看起来失控:

When there are more than 1 col, it looks out of control

添加行并不会真正造成这个问题。只有在添加cols时才会让事情变得不稳定。

这是我生成网格的代码

 for row in range(self.rows):
    for col in range(self.cols):
        tL=(offsetX+col*self.spacingX, 0, offsetZ+row*self.spacingZ)
        tR=(offsetX+(col+1)*self.spacingX, 0, offsetZ+row*self.spacingZ)
        bL=(offsetX+col*self.spacingX, 0, offsetZ+(row+1)*self.spacingZ)
        bR=(offsetX+(col+1)*self.spacingX, 0, offsetZ+(row+1)*self.spacingZ)
        vertices = tL+tR+bR+bL
        color = (0.8,0.8,0.7)*(len(vertices)//3)
        self.Lines.add(len(vertices)//3,GL_LINE_LOOP, None,\
        ('v3f/static',vertices),('c3f/static',color)

我尝试打印出每行的顶点,但所有序列看起来都是正确的(topRight-topLeft-btmLeft-btmRight),而且我被卡住了。

1 个答案:

答案 0 :(得分:1)

使用GL_LINE_LOOPGL_TRIANGLE_FAN时,您将获得奇怪的工件,除非您将其用于原始意图,即创建一个对象。

当您尝试混合多个"对象"使用相同的顶点列表对象(上面提到的两个)进入一个大的结构,他们很可能创建"连接线"你是否想要它。这是因为他们希望在某些时候附加到原始来源。

我在这里只看了你的数学,我没有坐标可供选择 但看起来你并没有根据他们总是连接到最后一个已知坐标的原则来绘制它们?

这是GL_LINE_LOOP

enter image description here

第一个选项:

考虑到这一点,你的大方块设置实际上是一个巨大的大型连接对象,你可以通过这样做来解决它:

enter image description here

第二个选项(按批次分开):

self.Lines = {}
self.Lines[0] = pyglet.graphics.Batch()
self.Lines[1] = pyglet.graphics.Batch()

对于每个广场(你应该有四个),你必须这样做:

self.Lines[square_ID].add(...)

第三个选项(调用glBegin):

    glBegin(GL_LINE_LOOP)
    glVertex2f(x1, y1)
    glVertex2f(x2, y2)
    ...
    glEnd()

您希望制作的每个广场。

最终(和最佳解决方案,使用GL_QUADS):

c = (255, 255, 255, 128)

window_corners = [
    (bottom_left[0], bottom_left[1], c),    # bottom left
    (top_left[0], top_left[1], c),          # top left
    (top_right[0], top_right[1], c),        # top right
    (bottom_right[0], bottom_right[1], c)   # bottom right
]

box_vl = self.pixels_to_vertexlist(window_corners)
box_vl.draw(pyglet.gl.GL_QUADS)