3d立方体没有正确显示pyglet

时间:2013-04-28 14:11:42

标签: python opengl pyglet

最近,我已经开始从这个网站学习openGL => http://3dgep.com/?p=2365
我遇到了一个问题。那是我没有得到网站显示的场景。

我在此网站上发布了我的代码:

import pyglet
from pyglet.gl import *
from pyglet import clock, window

'''
    http://www.learnersdictionary.com/search/aspect
    a dictionary site

    http://www.opengl.org/sdk/docs/man2/
    opengl api reference

'''

def vector(type, *args):
    '''
        return a ctype array
        GLfloat
        GLuint
        ...
    '''
    return (type*len(args))(*args)



class model:
    def __init__(self, vertices, colorMatrix, indice):
        self.vertices = vertices
        self.colorMatrix = colorMatrix
        self.indice = indice
        self.angle = 0

    def update(self):
        self.angle += 1
        self.angle %= 360

    def draw(self):
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

        glRotatef(self.angle, 1, 1, 0)


        glEnableClientState(GL_VERTEX_ARRAY)
        glEnableClientState(GL_COLOR_ARRAY)

        glColorPointer(3, GL_FLOAT, 0, vector(GLfloat, *self.colorMatrix))
        glVertexPointer(3, GL_FLOAT, 0, vector(GLfloat, *self.vertices))

        glDrawElements(GL_QUADS, len(self.indice), GL_UNSIGNED_INT, vector(GLuint, *self.indice))


        glDisableClientState(GL_COLOR_ARRAY)
        glDisableClientState(GL_VERTEX_ARRAY)



class world:
    def __init__(self):
        self.element = []

    def update(self, dt):
        for obj in self.element:
            obj.update()

    def addModel(self, model):
        self.element.append(model)

    def draw(self):
        for obj in self.element:
            obj.draw()


def setup():
    # look for GL_DEPTH_BUFFER_BIT
    glEnable(GL_DEPTH_TEST)







win = window.Window(fullscreen=False, vsync=True, resizable=True, height=600, width=600)
mWorld = world()

cube = (
    1, 1, 1, #0
    -1, 1, 1, #1
    -1, -1, 1, #2
    1, -1, 1, #3
    1, 1, -1, #4
    -1, 1, -1, #5
    -1, -1, -1, #6
    1, -1, -1 #7
)


color = (
    1, 0, 0,
    1, 0, 0,
    1, 0, 0,
    1, 0, 0,
    0, 1, 0,
    0, 1, 0,
    0, 0, 1,
    0, 0, 1
)

indice = (
    0, 1, 2, 3, # front face
    0, 4, 5, 1, # top face
    4, 0, 3, 7, # right face
    1, 5, 6, 2, # left face
    3, 2, 6, 7 # bottom face
    #4, 7, 6, 5  #back face
)

obj = model(cube, color, indice)
mWorld.addModel(obj)


@win.event
def on_resize(width, height):
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(-10, 10, -10, 10, -10, 10)
    glMatrixMode(GL_MODELVIEW)
    return pyglet.event.EVENT_HANDLED

@win.event
def on_draw():
    glClearColor(0.2, 0.2, 0.2, 0.8)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    mWorld.draw()


pyglet.clock.schedule(mWorld.update)
clock.set_fps_limit(30)
setup()
pyglet.app.run()

我想也许我会错过一些重要的概念,所以我无法得到正确的结果。谁能告诉我我犯了什么错误? :(

此外,还有一些奇怪的事情。

indice = (
    0, 1, 2, 3, # front face
    0, 4, 5, 1, # top face
    4, 0, 3, 7, # right face
    1, 5, 6, 2, # left face
    3, 2, 6, 7 # bottom face
    #4, 7, 6, 5  #back face
)

如果我取消注释这一行 从

#4, 7, 6, 5 #back face
 4, 7, 6, 5 #back face
屏幕不会显示任何内容......

2 个答案:

答案 0 :(得分:1)

0.0嗯,这很奇怪。我试图将此代码转换为C ++并正确显示。 我使用opengl,glut和c ++。所以,我想也许这就是pyglet上的问题。随你, 我可以继续学习openGL :)

最后,我找到了如何正确运行此代码的方法! 在这里更改代码

self.vertices = vector(GLfloat, *vertices)
self.colorMatrix = vector(GLfloat, *colorMatrix)
self.indice = vector(GLuint, *indice)

glColorPointer(3, GL_FLOAT, 0, self.colorMatrix)
glVertexPointer(3, GL_FLOAT, 0, self.vertices)
glDrawElements(GL_QUADS, len(self.indice), GL_UNSIGNED_INT, self.indice)
好吧,关键点垃圾收集? 我想

self.vertices = vector(GLfloat, *vertices)

这种方式使得有一个对象来引用向量,所以当我调用glDrawElements(...)和其他需要c型数组的函数时它不会被释放

答案 1 :(得分:0)

indice = (
 0, 1, 2, 3, # front face
 0, 4, 5, 1, # top face
 4, 0, 3, 7, # right face
 1, 5, 6, 2, # left face
 3, 2, 6, 7 # bottom face
#4, 7, 6, 5  #back face )

您错过了3,2,6,7[,] # bottom face的最后一个分号。