Как сделать анимацию координаты Y в opengl - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть цилиндр, и я хочу сделать анимацию координаты Y по закону Y = Y * cos (t + Y). Как я могу сделать это только с OpenGL? Какие функции я должен использовать? Может быть, несколько примеров?

def init():
    global xrot         
    global yrot         
    global ambient     
    global cylcolor    
    global lightpos     

    xrot = 0.0                         
    yrot = 0.0                      
    ambient = (1.0, 1.0, 1.0, 1)       
    cylcolor = (0, 0, 1, 0.8)  
    lightpos = (2.0, 2.0, 0)        

    glClearColor(0.5, 0.5, 0.5, 1.0)               
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0)         
    glRotatef(-90, 1.0, 0.0, 0.0)                  
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient) 
    glEnable(GL_LIGHTING)                           
    glEnable(GL_LIGHT0)                           
    glLightfv(GL_LIGHT0, GL_POSITION, lightpos)   

def draw():
    global xrot
    global yrot
    global lightpos
    global greencolor
    global cylcolor
    glClear(GL_COLOR_BUFFER_BIT)                               
    glPushMatrix()                                            
    glRotatef(xrot, 1.0, 0.0, 0.0)                              
    glRotatef(yrot, 0.0, 1.0, 0.0)                          
    glLightfv(GL_LIGHT0, GL_POSITION, lightpos)                
    glMaterialfv(GL_FRONT, GL_DIFFUSE, cylcolor)
    glTranslatef(0.0, 0.0, -0.7)                               
    glutSolidCylinder(0.5, 1, 20, 20)
    glPopMatrix()                                             
    glutSwapBuffers()                                           

, а затем основная часть программы

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(300, 300)
glutInitWindowPosition(50, 50)
glutInit(sys.argv)
glutDisplayFunc(draw)
init()
glutMainLoop()

1 Ответ

0 голосов
/ 01 ноября 2018

Обратите внимание, что рисование с помощью glBegin / glEnd последовательностей и стека конвейерной матрицы с фиксированными функциями устарело с десятилетий. Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершин и Шейдер для современного способа рендеринга.


В любом случае, вы должны позвонить glutPostRedisplay для непрерывного повторного отображения окна.
Используйте glutGet(GLUT_ELAPSED_TIME), чтобы получить количество миллисекунд с момента вызова glutInit.
Перевод может быть выполнен по glTranslate.

Далее я рекомендую установить буфер глубины (фокус на GLUT_DEPTH):

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)

и включить проверку глубины . Не забудьте также очистить буфер глубины:

glEnable(GL_DEPTH_TEST) 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 

Добавьте следующие строки в ваш код, чтобы выполнить движение вверх и вниз вдоль оси y окна просмотра:

import math

def draw():
    global xrot, yrot, lightpos, greencolor, cylcolor

    timeSinceStart = glutGet(GLUT_ELAPSED_TIME)

    glEnable(GL_DEPTH_TEST) 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)                               

    glPushMatrix()                              
    glTranslatef(0.0, 0.0, math.cos(timeSinceStart*0.002))                 
    glRotatef(xrot, 1.0, 0.0, 0.0)                              
    glRotatef(yrot, 0.0, 1.0, 0.0)                          

    glLightfv(GL_LIGHT0, GL_POSITION, lightpos)                
    glMaterialfv(GL_FRONT, GL_DIFFUSE, cylcolor)                            
    glutSolidCylinder(0.5, 1, 20, 20)
    glPopMatrix()                                             

    glutSwapBuffers()
    glutPostRedisplay()

Я создал следующую анимацию с изменениями, примененными к вашему исходному коду, и изменил следующие параметры:

xrot = 10.0  
lightpos = (2.0, -2.0, 1.0)  

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...