连续显示两个pyglet窗口

时间:2018-08-09 13:30:25

标签: python opengl pyglet

我正在编写一个有时必须显示obj文件的程序。 因此,我编写了一个函数(实际上,我在这里修改了代码:https://github.com/greenmoss/PyWavefront/blob/master/example/pyglet_demo.py),该函数使用旋转的3D对象打开pyglet窗口,并且当窗口关闭时,函数结束,并且我可以继续执行此操作直到我必须显示另一个(或相同的)obj文件为止。

此功能有效,但只有我第一次调用它。之后,我只有一个黑色的窗口。所以我希望有人知道我做错了...

这是我的代码(有点简化):

import ctypes
from pyglet.gl import *

rotation = 0


def show_3d(meshes):
    window = pyglet.window.Window(1024, 720, caption='Demo')
    lightfv = ctypes.c_float * 4

    @window.event
    def on_resize(width, height):
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(60., float(width)/height, 1., 500.)
        glMatrixMode(GL_MODELVIEW)
        return True

    @window.event
    def on_draw():
        window.clear()
        glLoadIdentity()

        glLightfv(GL_LIGHT0, GL_POSITION, lightfv(-1.0, 1.0, 1.0, 0.0))
        glEnable(GL_LIGHT0)

        glTranslated(0, 0, -300)

        glEnable(GL_CULL_FACE)
        glEnable(GL_DEPTH_TEST)
        glCullFace(GL_FRONT_AND_BACK)
        glRotatef(rotation, 0, 1, 0)

        glEnable(GL_LIGHTING)
        meshes.draw()

    def update(dt):
        global rotation
        rotation += 60*dt

    pyglet.clock.schedule(update)
    pyglet.app.run()


if __name__ == "__main__":
    from pywavefront import Wavefront
    mesh = Wavefront("path to a .obj")
    show_3d(mesh)  # awesome 3D animation
    # some stuff
    show_3d(mesh)  # just a black window

1 个答案:

答案 0 :(得分:0)

这是一种解决方法,但我想这不是完美的答案。

第一个问题是“ on_resize”在整个程序中仅被调用一次。 因此,我将该函数中的代码复制到了主函数中。

我必须保留on_resize函数,因为如果我不这样做,这是对show_3d的第一个调用,该调用不显示任何内容(?)。

第二个问题是,随着show_3d调用次数的增加(比如说5),我的动画播放的越来越快。不应该这样,因为我已经在“更新”中使用了dt参数来确保不是这种情况。

为使其正常工作,我尝试了pyglet.clock.set_fps_limit(60)和pyglet.clock.schedule_interval(update,1/60)。但是这些线都不起作用。 因此,我通过调用time.time()创建了自己的“ dt”。 现在可以了

import ctypes
from pyglet.gl import *
from time import time

rotation = 0
t0 = time()    

def show_3d(meshes):
    window = pyglet.window.Window(1024, 720, caption='Demo')
    lightfv = ctypes.c_float * 4
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(60., float(1024)/720, 1., 500.)
    glMatrixMode(GL_MODELVIEW)

    @window.event
    def on_resize(width, height):
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(60., float(width)/height, 1., 500.)
        glMatrixMode(GL_MODELVIEW)
        return True

    @window.event
    def on_draw():
        window.clear()
        glLoadIdentity()

        glLightfv(GL_LIGHT0, GL_POSITION, lightfv(-1.0, 1.0, 1.0, 0.0))
        glEnable(GL_LIGHT0)

        glTranslated(0, 0, -300)

        glEnable(GL_CULL_FACE)
        glEnable(GL_DEPTH_TEST)
        glCullFace(GL_FRONT_AND_BACK)
        glRotatef(rotation, 0, 1, 0)

        glEnable(GL_LIGHTING)
        meshes.draw()

    def update(dt):
        global rotation
        global t0

        dt = time()-t0
        t0 = time()
        rotation += 60*dt

    pyglet.clock.schedule(update)
    pyglet.app.run()


if __name__ == "__main__":
    from pywavefront import Wavefront
    mesh = Wavefront("path to a .obj")
    show_3d(mesh)  # awesome 3D animation
    # some stuff
    show_3d(mesh)  # awesome 3D animation