【问题标题】:Drawing a cube with Pygame and OpenGL in Python environment在 Python 环境中使用 Pygame 和 OpenGL 绘制立方体
【发布时间】:2021-03-14 10:40:54
【问题描述】:

我得到了这段代码来使用 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()

我可能做错了什么请帮忙..

【问题讨论】:

    标签: python opengl pygame pyopengl


    【解决方案1】:

    vertex 是一个三元组,因此不能用于订阅。 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()
    

    【讨论】:

    • 没注意到,谢谢指出
    • 得到了准确的输出,vertex in edge 我的帖子也有错误的代码
    【解决方案2】:

    问题在您的错误消息中得到了很好的解释。您正在尝试使用元组 vertices[(1, -1, -1)] 为列表编制索引,这显然是行不通的。

    假设您尝试在每个元组上调用 glVertex3f,请将指定的行替换为 glVertex3f(vertex),这将导致它在您的顶点列表中的每个元组上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多