Pyglet顶点列表索引异常

2024-10-04 01:36:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些关于pyglet中渲染坐标轴的类:

class Axis(object):
    def __init__(self,
                 position=(0.0, 0.0, 0.0),
                 x_color=(1.0, 0.0, 0.0),
                 y_color=(0.0, 1.0, 0.0),
                 z_color=(0.0, 0.0, 1.0),
                 length=1.0):

        self.position = list(position)

        self.x_color = map(float, list(x_color))
        self.y_color = map(float, list(y_color))
        self.z_color = map(float, list(z_color))

        self.length = float(length)

        lines = (
            0, 1,
            0, 2,
            0, 3
        )

        vertices = (
            self.position[0], self.position[1], self.position[2],
            self.length, 0.0, 0.0,
            0.0, self.length, 0.0,
            0.0, 0.0, self.length
        )

        colors = (
            self.x_color[0], self.x_color[1], self.x_color[2],
            self.y_color[0], self.y_color[1], self.y_color[2],
            self.z_color[0], self.z_color[1], self.z_color[2]
        )

        self.vertex_list = pyglet.graphics.vertex_list_indexed(
            len(vertices) / 3,
            lines,
            ('v3f', vertices),
            ('c3f', colors),
        )

    def draw(self):
        self.vertex_list.draw(GL_LINES)

当我在我的程序中使用这段代码时,会出现异常:

^{pr2}$

如果删除('c3f', colors)一切正常,但没有颜色。我做错什么了?在


Tags: selfmapdefpositionfloatlengthlistcolor
1条回答
网友
1楼 · 发布于 2024-10-04 01:36:39

使用4个顶点,但颜色数组只有3个条目。这些数组的大小需要匹配。每个位置和颜色的不同组合都需要一个顶点。所以要画3条不同颜色的线,你需要6个顶点。它们中的3个共享同一位置这一事实没有任何区别,因为在该位置需要具有3种不同颜色的顶点。在

另外,如果我正确地理解了你想做什么,顶点位置看起来有部分错误。第2个、第3个和第4个顶点看起来像是相对于第1个顶点,但它们都必须是绝对坐标。在

总的来说,这些阵列应该可以满足您的需要:

vertices = (
    self.position[0], self.position[1], self.position[2],
    self.position[0] + self.length, self.position[1], self.position[2],
    self.position[0], self.position[1], self.position[2],
    self.position[0], self.position[1] + self.length, self.position[2],
    self.position[0], self.position[1], self.position[2],
    self.position[0], self.position[1], self.position[2] + self.length
)

colors = (
    self.x_color[0], self.x_color[1], self.x_color[2],
    self.x_color[0], self.x_color[1], self.x_color[2],
    self.y_color[0], self.y_color[1], self.y_color[2],
    self.y_color[0], self.y_color[1], self.y_color[2],
    self.z_color[0], self.z_color[1], self.z_color[2]
    self.z_color[0], self.z_color[1], self.z_color[2]
)

您还需要相应地调整索引列表以匹配新顶点定义:

^{pr2}$

但是,由于没有机会共享顶点,因此在这种情况下使用非索引几何体更容易。在

相关问题 更多 >