Pyglet 顶点列表索引异常
我有一个类,用来在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)
当我在我的程序中使用这段代码时,出现了异常:
Traceback (most recent call last):
File "/home/linch/Project/modelviewer/window.py", line 163, in <module>
window = ModelViewerWindow()
File "/home/linch/Project/modelviewer/window.py", line 79, in __init__
self.axis = Axis()
File "/home/linch/Project/modelviewer/window.py", line 47, in __init__
('c4f', colors),
File "/usr/local/lib/python2.7/dist-packages/pyglet/graphics/__init__.py", line 301, in vertex_list_indexed
return _get_default_batch().add_indexed(count, 0, None, indices, *data)
File "/usr/local/lib/python2.7/dist-packages/pyglet/graphics/__init__.py", line 385, in add_indexed
vlist._set_attribute_data(i, array)
File "/usr/local/lib/python2.7/dist-packages/pyglet/graphics/vertexdomain.py", line 413, in _set_attribute_data
region.array[:] = data
ValueError: Can only assign sequence of same size
如果我去掉 ('c3f', colors)
,一切就正常了,但这样就没有颜色了。我到底哪里出错了?
1 个回答
2
你用到了4个顶点,但你的颜色数组只有3个条目。这两个数组的大小需要一致。每种位置和颜色的不同组合都需要一个顶点。所以如果你想画3条不同颜色的线,你就需要6个顶点。虽然其中3个顶点的位置是一样的,但这没关系,因为在那个位置你需要3种不同颜色的顶点。
另外,如果我理解得没错,你的顶点位置看起来有点问题。第二、第三和第四个顶点似乎是相对于第一个顶点的,但它们都需要是绝对坐标。
总的来说,这些数组应该能满足你的需求:
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]
)
你还需要相应地调整索引列表,以匹配新的顶点定义:
lines = (
0, 1,
2, 3,
4, 5
)
不过,由于没有共享顶点的机会,在这种情况下使用非索引几何体可能会更简单。