连续显示两个 pyglet window
Display two pyglet window in a row
我正在编写一个有时必须显示 obj 文件的程序。
所以我写了一个函数(实际上,我修改了这里的代码:https://github.com/greenmoss/PyWavefront/blob/master/example/pyglet_demo.py)打开一个 pyglet window,用我旋转的 3D 对象,当 window 关闭时,函数结束,我可以继续做一些事情,直到我必须显示另一个(或相同的)obj 文件。
这个函数有效,但只是我第一次调用它。在那之后我只有一个黑色window。所以我希望有人知道我做错了什么...
这是我的(稍微简化的)代码:
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(更新,1/60)。但是 none 行有效。
所以我通过调用 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
我正在编写一个有时必须显示 obj 文件的程序。 所以我写了一个函数(实际上,我修改了这里的代码:https://github.com/greenmoss/PyWavefront/blob/master/example/pyglet_demo.py)打开一个 pyglet window,用我旋转的 3D 对象,当 window 关闭时,函数结束,我可以继续做一些事情,直到我必须显示另一个(或相同的)obj 文件。
这个函数有效,但只是我第一次调用它。在那之后我只有一个黑色window。所以我希望有人知道我做错了什么...
这是我的(稍微简化的)代码:
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(更新,1/60)。但是 none 行有效。 所以我通过调用 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