2016-03-11 2 views
1

я понял, что, когда я запускаю этот код треугольник появляется вращающимся в реальное времяПочему мой glutDisplayFunc не обновляется в режиме реального времени?

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 используются.

ответ

2

glutDisplayFunc не является причудливым способом вызова функции. Он просто говорит GLUT, что, когда это хочет отобразить экран, он будет вызывать функцию, которую вы передаете. Он не будет немедленно называть данную функцию.

См., Когда вы звоните glutMainLoop, это означает, что GLUT теперь владеет вашим приложением. Он будет вызывать любые обратные вызовы, которые вы зарегистрировали, но это единственный способ сделать что-то. Если GLUT решит, что экран нужно перерисовать, будет вызвана функция, которую вы зарегистрировали в glutDisplayFunc.

То, что вы хотите сделать, это две вещи:

  1. GLUT Force чтобы снова отобразить экран при разумной частоте. Обычно GLUT только обновляет экран, если что-то раскрывает часть окна, или если оно перемещается вокруг или так далее. То есть, GLUT предполагает, что анимация не происходит.

  2. Каждый раз, когда экран обновляется, отрегулируйте угол поворота для какого-либо объекта.

# 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() 
+0

Мне становится ясно. Он работает нормально. Спасибо!!! – Jaxbal