为什么我的glutDisplayFunc不能实时更新?

时间:2016-03-11 00:37:52

标签: python-2.7 opengl glut

我意识到当我运行此代码时,三角形会实时旋转

def main():

   glutInit(sys.argv)
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
   glutInitWindowSize(600,400)
   glutCreateWindow("Seismic")
   glMatrixMode(GL_PROJECTION)
   glLoadIdentity()
   glMatrixMode(GL_MODELVIEW)
   glClearColor(0,0,0,0)
   glPushMatrix()

   gluPerspective(45, (600/400), 0, 15) 
   glTranslatef(0,-0.2,-1.5)   
   k = 0
   while k<10000:

       glRotatef(0.1, 0, 1, 0) 

       k +=1
       print k

       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
       glBegin(GL_TRIANGLES)
       glColor3f(1,0,0,0)
       glVertex3f(0,0,0)
       glColor3f(0,1,0,0)
       glVertex3f(0,0.5,0)
       glColor3f(0,0,1,0)
       glVertex3f(0.5,0.5,0)
       glEnd() 
       glutSwapBuffers()

       #time.sleep(1)

   glutMainLoop()
   return
if __name__ == '__main__': main()

但另一方面,当我使用glutDisplayFunc时,你必须等待完成循环以获得三角形。

def triangulo():
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
   glBegin(GL_TRIANGLES)
   glColor3f(1,0,0,0)
   glVertex3f(0,0,0)
   glColor3f(0,1,0,0)
   glVertex3f(0,0.5,0)
   glColor3f(0,0,1,0)
   glVertex3f(0.5,0.5,0)
   glEnd() 
   glutSwapBuffers()

def main():

   glutInit(sys.argv)
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
   glutInitWindowSize(600,400)
   glutCreateWindow("Seismic")
   glMatrixMode(GL_PROJECTION)
   glLoadIdentity()
   glMatrixMode(GL_MODELVIEW)
   glClearColor(0,0,0,0)
   glPushMatrix()

   gluPerspective(45, (600/400), 0, 15) #3D effect
   glTranslatef(0,-0.2,-1.5)  # Ocurre el pocicionamiento
   k = 0
   while k<10000:
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
     glRotatef(0.1, 0, 1, 0) #vector de rotacion  (degrees,(eje-vector))
     glutDisplayFunc(triangulo) 
     k +=1
     print k 
     #time.sleep(1)

   glutMainLoop()
   return

if __name__ == '__main__': main()

我想知道如何在使用glutDisplayFunc时实时获得旋转三角形。

1 个答案:

答案 0 :(得分:2)

glutDisplayFunc不是一种调用函数的奇特方式。它只是告诉GLUT,当想要显示屏幕时,它会调用你传递的函数。它不会立即调用给定的函数。

当您致电glutMainLoop时,请注意,这意味着GLUT现在拥有您的应用程序。它将调用您已注册的任何回调,但这是完成某项操作的唯一方法。如果GLUT决定需要重新显示屏幕,则会调用您在glutDisplayFunc注册的功能。

你想做的是两件事:

  1. 强制GLUT以合理的频率重新显示屏幕。通常情况下,GLUT只会更新屏幕的显示,如果有什么东西揭开了窗口的一部分,或者它是否被移动等等。也就是说,GLUT假定动画没有发生。

  2. 每次更新屏幕时,请调整某个对象的旋转角度。

  3. #1要求显示功能调用glutPostRedisplay。这告诉GLUT重新显示屏幕。 #2是你已经完成的事情。最终,你真正想要的是把while循环中的所有东西都带到一个函数中。一个以glutPostRedisplay

    的调用结束的结果
    def triangulo():
        glRotatef(0.1, 0, 1, 0) 
    
        k +=1
        print k
    
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        glBegin(GL_TRIANGLES)
        glColor3f(1,0,0,0)
        glVertex3f(0,0,0)
        glColor3f(0,1,0,0)
        glVertex3f(0,0.5,0)
        glColor3f(0,0,1,0)
        glVertex3f(0.5,0.5,0)
        glEnd() 
        glutSwapBuffers()
        glutPostRedisplay()
    
    def main():
        glutInit(sys.argv)
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
        glutInitWindowSize(600,400)
        glutCreateWindow("Seismic")
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glMatrixMode(GL_MODELVIEW)
        glClearColor(0,0,0,0)
        glPushMatrix()
    
        gluPerspective(45, (600/400), 0, 15) 
        glTranslatef(0,-0.2,-1.5)   
        k = 0
        glutDisplayFunc(triangulo) #Calling the triangulo function    
        glutMainLoop()
        return
    
    if __name__ == '__main__': main()