Pyglet没有绘制预定的功能

时间:2014-08-08 08:51:36

标签: python opengl pyglet

好的,所以我一般都是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()

简单地说,如果我从on_draw调用DrawCircle,它会根据需要创建一个圆圈。如果我安排它没有得到任何东西。调度程序本身正在工作,因为dt打印到控制台。我猜测on_draw正在设置上下文或允许它绘制的东西,而当我调度它时,上下文或者缓冲区是错误的。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是正确的代码:

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

答案 1 :(得分:0)

尝试在更新功能中添加window.switch_to()上方的绘制调用和window.flip()

虽然如msarch的回答所述,你应该避免使用更新函数,并让on_draw函数处理它。