在Python环境中使用Pygame和OpenGL绘制一个立方体

3
我用Python在pygame窗口中绘制OpenGL立方体的代码,但每次尝试编译时都会出现以下错误: line 34, in Cube glVertex3f(vertices[vertex]) TypeError: tuple indices must be integers or slices, not tuple。请问有谁知道如何更正代码,以使程序实现其预期功能?
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
##Define the vertices. usually a cube contains 8 vertices
vertices=( (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1))
##define 12 edges for the body
edges = (
    (0,1),
    (0,3),
    (0,4),
    (2,1),
    (2,3),
    (2,7),
    (6,3),
    (6,4),
    (6,7),
    (5,1),
    (5,4),
    (5,7)
    )
##define function to draw the cube
def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in vertices:
            glVertex3f(vertices[vertex])
    glEnd
##Define main function to draw a window for the openGL
def main():
    pygame.init()
    display=(600,600)
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
    gluPerspective(45, (display[0] / display[1]), 0.1, 50.0)
    glTranslatef(0.0, 0.0, -5)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        glRotatef(1, 3, 1, 1)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        Cube()
        pygame.display.flip()
        pygame.time.wait(10)


main()

我可能做错了什么,请帮忙指出来。

2个回答

2

vertex是一个由3个元素组成的元组,因此无法用于订阅。而glVertex3f需要3个参数。因此你需要解压元组或者使用OpenGL指令glVertex3fv代替glVertex3f(参见glVertex):

glVertex3f(vertices[vertex])

glVertex3fv(vertex)

或者

glVertex3f(*vertex)

此外,glEnd 后面的括号缺失:

glEnd

glEnd()

但是如果你想要绘制一个线框立方体,你需要为立方体的每个边绘制线段:

def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for index in edge:
            glVertex3fv(vertices[index])
    glEnd()


没有注意到,谢谢你指出来。 - user14187680
2
得到了精确的输出,同时我的帖子中“边缘中的顶点”也有错误的代码。 - user14187680

1
你的错误信息已经很明确地解释了问题。你正尝试用元组索引列表,vertices[(1, -1, -1)]显然不会起作用。
假设你想对每个元组调用glVertex3f,请用glVertex3f(vertex)替换指定行,它将在vertices列表中的每个元组上运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接