好的,所以我对pyglet和OpenGL都是完全的新手,我想知道为什么这不起作用:
def DrawCircle(cx, cy, r, segments):
theta = 2*3.1415926/segments
c = math.cos(theta)
s = math.sin(theta)
x = r
y = 0
pyglet.gl.glBegin(pyglet.gl.GL_POLYGON)
pyglet.gl.glColor3f(0.05,0.2,0.9)
for counter in range(segments):
pyglet.gl.glVertex2f(x+cx, y+cy)
t = x
x = c * x - s * y
y = s * t + c * y
pyglet.gl.glEnd()
if __name__ == '__main__':
window = pyglet.window.Window(960,1010)
window.set_location(959,20)
@window.event
def on_draw():
window.clear()
def update(dt):
print(dt)
DrawCircle(500,500,20,30)
pyglet.clock.schedule_once(update,0.6)
pyglet.app.run()简单地说,如果我从DrawCircle调用on_draw,它就会创建一个完全按照需要的圆。如果我安排的话什么都画不出来。调度程序本身是工作的,因为dt打印到控制台。我猜想on_draw正在设置上下文或允许它绘制的东西,而当我安排它时,上下文或者缓冲区可能是错误的。任何帮助都将不胜感激。
发布于 2014-08-08 09:21:49
在update函数中之后,尝试将window.switch_to()添加到绘图调用和window.flip()上面。
尽管,正如msarch的答案中所提到的,您应该避免使用更新函数并让on_draw函数来处理它。
发布于 2014-08-08 09:32:03
以下是正确的代码:
import pyglet
import math
window = pyglet.window.Window(960,1010)
window.set_location( 50,50)
def DrawCircle(cx, cy, r, segments):
theta = 2*3.1415926/segments
c = math.cos(theta)
s = math.sin(theta)
x = r
y = 0
pyglet.gl.glColor3f(0.05,0.2,0.9)
pyglet.gl.glBegin(pyglet.gl.GL_POLYGON)
for counter in range(segments):
pyglet.gl.glVertex2f(x+cx, y+cy)
t = x
x = c * x - s * y
y = s * t + c * y
pyglet.gl.glEnd()
@window.event
def on_draw():
window.clear()
DrawCircle(500,500,20,30)
if __name__ == '__main__':
pyglet.app.run()对于Pyglet,所有的绘图通常都是在on_draw方法中完成的。由于每次重绘时都要清除窗口,所以每次都必须绘制形状。
更新函数不一定与显示相关
调度一次或在规则的间隔通常用于修改各种参数的一个固定的间隔(即: x,y += dx,dy *dt的动画)。
请参阅:http://pyglet.org/doc/api/pyglet.clock-module.html
https://stackoverflow.com/questions/25199468
复制相似问题