Pyglet on_draw 不会绘制更新的函数

Posted

技术标签:

【中文标题】Pyglet on_draw 不会绘制更新的函数【英文标题】:Pyglet on_draw wont draw updated function 【发布时间】:2020-05-03 22:30:32 【问题描述】:

crtaj() 函数(主要绘图函数)采用两个全局矩阵“T”和“P”,使用这两个矩阵对全局顶点“vrhovi”应用变换,并将变换后的顶点存储到“novivrhovi”中,然后使用转换后的顶点“novivrhovi”和全局“poligoni”绘制多边形(描述顶点的连接)。当按下“向上”键时,矩阵“T”和“P”被更新。我想要的是绘制这些更新中的每一个,但是在初始绘制之后,在按下第一个“向上”之后屏幕变为空白。我 100% 确定我的转换没问题,因为按下一次键会给出我试图设置为初始值的矩阵,并且它会正确绘制它,所以在使用默认初始值并按下时没有理由不正确绘制,因为结果是一样的,每次我按“向上”时,该函数甚至会打印正确的顶点,但什么都不显示。

@window.event
def on_draw():
    
    glScalef(150,150,150)
    glTranslatef(sum(xkord)/2,sum(ykord)/2,0)
    
    window.clear()
    crtaj()
    
    
@window.event
def on_key_press(key, modifiers):
    global vrhovi
    
    if (key == pyglet.window.key.UP):
        ociste[0][0]=ociste[0][0]+1
        transform()
        on_draw()
        
#main draw
def crtaj():
    
    
    glBegin(GL_LINE_LOOP)
    global T
    global P
    global vrhovi
    global poligoni
    
    #calculate new vertices of polygon-->novivrhovi
    
    novivrhovi = []

    for vrh in vrhovi:
        novivrh = vrh.copy()
        novivrh.append(1)
        novivrh = np.matrix(novivrh)
        novivrh = novivrh.dot(T)
        novivrh = novivrh.dot(P)
        novivrh = novivrh.tolist()
        novivrhovi.append(novivrh[0])
    print("N O V I V R H O V I")
    print(novivrhovi)

    #draw the poligon
    for poligon in poligoni:
        
        index0 = poligon[0]-1
        index1 = poligon[1]-1
        index2 = poligon[2]-1
        
        glVertex4f(novivrhovi[index0][0],novivrhovi[index0][1],novivrhovi[index0][2],novivrhovi[index0][3])
        glVertex4f(novivrhovi[index1][0],novivrhovi[index1][1],novivrhovi[index1][2],novivrhovi[index1][3])
        glVertex4f(novivrhovi[index2][0],novivrhovi[index2][1],novivrhovi[index2][2],novivrhovi[index2][3])
    glEnd()

pyglet.app.run()

【问题讨论】:

on_key_press 中 on_draw() 的调用是错误的,但不会改变结果。我已经尝试调试了好几个小时了,如果您有任何问题,我会发布更多代码,因为这可能看起来像一团糟。 【参考方案1】:

但在初次绘制后,在按下第一次“向上”后屏幕变为空白。

Legacy OpenGL 矩阵运算(如 glScalefglTranslatef)不只是设置一个矩阵,它们定义一个新矩阵并将当前矩阵乘以新矩阵。 OpenGL 是一个状态引擎,状态会一直保存到它们再次改变,甚至超出帧。因此,在您的应用程序中,当前矩阵会逐渐缩放和平移。

on_draw开头加载Identity matrix:

@window.event
def on_draw():

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glScalef(150,150,150)
    glTranslatef(sum(xkord)/2,sum(ykord)/2,0)

    window.clear()
    crtaj()

PyGlet 默认设置一个Orthographic projection 投影矩阵到窗口空间。见pyglet.window。如果你想要不同的投影,可以通过glOrtho设置:

@window.event
def on_draw():

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0, window.width, window.height, 0, -1, 1)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glScalef(150,150,150)
    glTranslatef(sum(xkord)/2,sum(ykord)/2,0)

    window.clear()
    crtaj()

【讨论】:

以上是关于Pyglet on_draw 不会绘制更新的函数的主要内容,如果未能解决你的问题,请参考以下文章

(未完成)Pyglet实现SideBar

为啥我的窗口不适用于 on_draw?

为啥 Pyglet 不能正确绘制多边形?

如何使用pyglet保存当前视图矩阵

Python,Pyglet 在模板蒙版内绘制形状像素

如何在不重绘整个视图的情况下更新 NSView 的一部分