Создаём первую анимацию в openGL на С++

Я уже писал об основах создания приложений openGL, давайте немного усложним задачу и попытаемся создать приложение, в окне которого движется с заданной скоростью квадрат.
Создайте новый проект в вашей любимой студии, подключите библиотеки к проекту.
Когда всё готово приступайте к кодингу.

Подключаем заголовочный файл glut:

#include <GL/freeglut.h>

Предопределим глобальными переменными место появления и размер блока:

GLfloat x1 = 0.0f;   /// GLfloat - аналог float
GLfloat y1 = 0.0f;
GLfloat rsize = 25;

Скорость перемещения по OX и OY:

GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;

Как и в предыдущем примере создадим две переменные для хранения размеров окна:

GLfloat windowWidth;
GLfloat windowHeight;

Прежде всего создадим функцию рендеринга:

void RenderScene(void){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f,0.0f,0.0f);  //красный
    glRectf(x1,y1,x1+rsize,y1-rsize);   /// рисуем квадрат
    glutSwapBuffers();
}

Приведу 2 функции без комментариев. Они к делу относятся слабо, да и сложного в них ничего нет:

void SetupRC(void){
    glClearColor(0.0f,0.0f,1.0f,1.0f);
}

void ChangeSize(GLsizei w, GLsizei h) {
    GLfloat aspectRatio;
    if (h == 0)
        h = 1;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    aspectRatio = (GLfloat)w / (GLfloat)h;
    if (w <= h){
        windowWidth = 100;
        windowHeight = 100 / aspectRatio;
        glOrtho(-100.0,100.0,-windowHeight,windowHeight,1.0,-1.0);
    } else {
        windowWidth = 100 * aspectRatio;
        windowHeight = 100;
        glOrtho(-windowWidth,windowWidth,-100.0,100.0,1.0,-1.0);
    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

Следующей на очереди будет функция, вызываемая таймером:

void TimerFunction(int value){
    if (x1 > windowWidth - rsize || x1 < -windowWidth)   /// проверка на достижение края экрана по OX
        xstep = -xstep;
    if (y1 > windowHeight || y1 < -windowHeight + rsize)  /// ... по OY
        ystep = -ystep;
    x1 += xstep;   // сдвигаем координаты на заданный шаг
    y1 += ystep;
    if (x1 > (windowWidth-rsize+xstep))   /// проверяем не приведёт ли это к выходу за границу экрана
        x1 = windowWidth-rsize-1;
    else if (x1 < -(windowWidth + xstep))  // с другой стороны
        x1 = -windowWidth - 1;
    if (y1 > (windowHeight+ystep))    ///по другим осям
        y1 = windowHeight-1;
    else if(y1 < -(windowHeight-rsize+ystep))
        y1 = -windowHeight+rsize-1;
    glutPostRedisplay();  // перерисовываем экран
    glutTimerFunc(33,TimerFunction,1);  //запускаем таймер заново.
}

Ну и функция main, которая всё это дело запустит:

int main(int argc,char**argv) {
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutCreateWindow("Bounce");
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);
    glutTimerFunc(33,TimerFunction,1);  //первый запуск таймера
    SetupRC();
    glutMainLoop();
    return 0;
}

Как вы уже наверное догадались, вся "фишка" этой анимации кроется в функции таймере - glutTimerFunc(). По прошествии заданного времени она вызывает заданную функцию TimerFunction(), которая смещает блок на указанный нами шаг. При это приходится постоянно проводить проверки на наличие блока в области.

Получается вот так:

Просмотров:   9245

Комментарии

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!