3 votes

Dessiner un cube avec Pygame et OpenGL dans l'environnement Python

J'ai obtenu ce code pour dessiner un cube OpenGL dans une fenêtre pygame avec python, mais à chaque fois que j'essaie de compiler, le message suivant apparaît line 34, in Cube glVertex3f(vertices[vertex]) TypeError: tuple indices must be integers or slices, not tuple Toute personne qui sait comment corriger le code pour que le programme atteigne sa fonction prévue.

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()

Qu'est-ce que je pourrais faire de mal, s'il vous plaît aidez

3voto

Rabbid76 Points 52493

vertex est un tuple à 3 composants, il ne peut donc pas être utilisé pour les abonnements. glVertex3f attend 3 arguments. Par conséquent, vous devez soit décompresser le tuple, soit utiliser l'instruction OpenGL glVertex3fv au lieu de glVertex3f (voir glVertex ) :

glVertex3f(vertices[vertex])

glVertex3fv(vertex)

o

glVertex3f(*vertex)

De plus, les parenthèses après glEnd sont absents :

glEnd

glEnd()

Mais si vous voulez dessiner un cube filaire, vous devez dessiner des segments de ligne pour chaque bord du cube :

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

2voto

incarnadine Points 654

Le problème est bien expliqué dans votre message d'erreur. Vous essayez d'indexer une liste avec des tuples vertices[(1, -1, -1)] ce qui évidemment ne fonctionnera pas.

En supposant que vous essayez d'appeler glVertex3f sur chaque tuple, remplacer la ligne spécifiée par glVertex3f(vertex) ce qui le fera fonctionner sur chaque tuple de votre liste de sommets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X