Создаём первую анимацию в 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(), которая смещает блок на указанный нами шаг. При это приходится постоянно проводить проверки на наличие блока в области.

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

 

Источник: malimar.ru

teamviewer-com
Не копируйте текст!