[英]Pyglet on_draw wont draw updated function
crtaj() function(主要绘图函数)采用两个全局矩阵“T”和“P”,使用这两个矩阵对全局顶点“vrhovi”进行变换,并将变换后的顶点存储到“novivrhovi”中,然后绘制使用变换顶点“novivrhovi”和全局“poligoni”的多边形(描述顶点的连接)。 当按下“向上”键时,矩阵“T”和“P”被更新。 我想要的是绘制这些更新中的每一个,但是在初始绘制之后,在按下第一个“向上”后屏幕变为空白。 我 100% 确定我的转换是可以的,因为按下一次键会给出我试图设置为初始值的矩阵,并且它会正确绘制它,所以在使用默认初始值并按下时没有理由不正确绘制,因为结果是相同的,function 甚至在我每次按“向上”时都会打印正确的顶点,但没有显示任何内容。
@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()
但在初始绘制后,第一次按下“向上”后屏幕变为空白。
传统的 OpenGL矩阵运算(如glScalef
和glTranslatef
不仅仅设置矩阵,它们定义一个新矩阵并将当前矩阵乘以新矩阵。
OpenGL 是一个 state 引擎,状态会一直保留,直到它们再次更改,甚至超出帧。 因此,在您的应用程序中,当前矩阵会逐渐缩放和平移。
在on_draw
的开头加载身份矩阵:
@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 默认将正交投影投影矩阵设置为 window 空间。 请参阅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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.