簡體   English   中英

連續顯示兩個pyglet窗口

[英]Display two pyglet window in a row

我正在編寫一個有時必須顯示obj文件的程序。 因此,我編寫了一個函數(實際上,我從這里修改了代碼: https : //github.com/greenmoss/PyWavefront/blob/master/example/pyglet_demo.py )打開了一個pyglet窗口,其中包含旋轉的3D對象,並且當窗口關閉時,函數結束,在可以顯示另一個(或相同)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

這是一種解決方法,但我想這不是完美的答案。

第一個問題是“ on_resize”在整個程序中僅被調用一次。 因此,我將該函數中的代碼復制到主要函數中。

我必須保留on_resize函數,因為如果我不這樣做,這是對show_3d的第一個調用,該調用不顯示任何內容(?)。

第二個問題是,隨着對show_3d的調用更多(比如5),我的動畫進行得越來越快。 不應該這樣,因為我已經在“ update”中使用了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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM