我意识到当我运行此代码时,三角形会实时旋转
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时实时获得旋转三角形。
答案 0 :(得分:2)
glutDisplayFunc
不是一种调用函数的奇特方式。它只是告诉GLUT,当它想要显示屏幕时,它会调用你传递的函数。它不会立即调用给定的函数。
当您致电glutMainLoop
时,请注意,这意味着GLUT现在拥有您的应用程序。它将调用您已注册的任何回调,但这是完成某项操作的唯一方法。如果GLUT决定需要重新显示屏幕,则会调用您在glutDisplayFunc
注册的功能。
你想做的是两件事:
强制GLUT以合理的频率重新显示屏幕。通常情况下,GLUT只会更新屏幕的显示,如果有什么东西揭开了窗口的一部分,或者它是否被移动等等。也就是说,GLUT假定动画没有发生。
每次更新屏幕时,请调整某个对象的旋转角度。
#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()