使用 Pyglet 和 GL_LINE_LOOP 的网格
Grid with Pyglet and GL_LINE_LOOP
我正在尝试使用 GL_LINE_LOOP 在 pyglet 中创建网格。但是,我在处理顶点序列时遇到问题。
一个矩形工作正常:
当超过1个col时,看起来失控:
添加行并不会真正造成这个问题。只有在添加 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),但我卡住了。
使用 GL_LINE_LOOP
或 GL_TRIANGLE_FAN
时你会得到奇怪的工件,除非你使用它的初衷是为了创建一个对象。
当您尝试使用相同的顶点列表对象(上面提到的两个)将多个 "objects" 混搭成一个大结构时,无论您是否想要,它们很可能会创建 "connecting lines"。这是因为他们希望在某个时候附加到原始来源。
我在这里只看了一眼你的数学,我没有坐标可以尝试。
但是看起来你不是根据它们总是连接到最后一个已知坐标的原则来绘制它们的?
这是GL_LINE_LOOP
:
第一个选项:
考虑到这一点,您的大方形设置实际上是一个巨大的连接对象,您可以通过这样做来解决它:
第二个选项(按批次分开):
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)
我正在尝试使用 GL_LINE_LOOP 在 pyglet 中创建网格。但是,我在处理顶点序列时遇到问题。
一个矩形工作正常:
当超过1个col时,看起来失控:
添加行并不会真正造成这个问题。只有在添加 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),但我卡住了。
使用 GL_LINE_LOOP
或 GL_TRIANGLE_FAN
时你会得到奇怪的工件,除非你使用它的初衷是为了创建一个对象。
当您尝试使用相同的顶点列表对象(上面提到的两个)将多个 "objects" 混搭成一个大结构时,无论您是否想要,它们很可能会创建 "connecting lines"。这是因为他们希望在某个时候附加到原始来源。
我在这里只看了一眼你的数学,我没有坐标可以尝试。
但是看起来你不是根据它们总是连接到最后一个已知坐标的原则来绘制它们的?
这是GL_LINE_LOOP
:
第一个选项:
考虑到这一点,您的大方形设置实际上是一个巨大的连接对象,您可以通过这样做来解决它:
第二个选项(按批次分开):
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)