rotateHex, которая вызывается процедурой glutldleFunc в процедуре mouse-Fcn. Вращение прекращается нажатием правой кнопки мыши, что приводит к вызову процедуры glutldleFunc с аргументом NULL.

♦include <GL/glut.h>

♦include <math.h>

♦include <stdlib.h> const double TWO_PI = 6.2831853;

GLsizei winWidth = 500, winHeight - 500;

// Размер исходного окна на экране.

GLuint regHex; //Определяет имя таблицы отображения, static GLfloat rotTheta “ 0.0; class scrPt { public:

GLint x, y;

};

static void init (void)

{

scrPt hexVertex;

GLdouble hexTheta;

GLint k;

glClearColor (1.0, 1.0, 1.0, 0.0);

/* Задает таблицу отображения для правильного красного

* шестиугольника. Вершины шестиугольника - шесть равномерно

* расположенных точек на окружности.

*/

regHex = glGenLists (1); glNewList (regHex, GL_COMPILE); glColor3f (1.0, 0.0, 0.0); glBegin (GL_POLYGON);

for (k =0; k < 6; k++) {

hexTheta = TWO_PI * k / 6; hexVertex.x = 150 + 100 * cos (hexTheta); hexVertex.у = 150 + 100 * sin (hexTheta); glVertex2i (hexVertex.x, hexVertex.y);

}

glEnd ( ); glEndList ( );

}

void displayHex (void)

{

glClear (GL_COLOR_BUFFER_BIT); glPushMatrix ( );

glRotatef (rotTheta, 0.0, 0.0, 1.0);

glCallList (regHex);

glPopMatrix ( );

glutSwapBuffers ( );

glFlush ( );

}

void rotateHex (void) { rotTheta += 3.0; if (rotTheta > 360.0) rotTheta -= 360.0; glutPostRedisplay ( );

}

void winReshapeFcn (GLint newWidth, GLint newHeight)

{

glViewport (0, 0, (GLsizei) newWidth, (GLsizei) newHeight) glMatrixMode (GL_PROJECTION); glLoadldentity ( );

gluOrtho2D (-320.0, 320.0, -320.0, 320.0); glMatrixMode (GL_MODELVIEW); glLoadldentity ( ); glClear (GL_COLOR_BUFFER_BIT);

}

void mouseFcn (GLint button, GLint action, GLint x, GLint y)

{

switch (button) {

case GLUT_MIDDLE_BUTTON: // Начать вращение,

if (action == GLUTJDOWN)

glutldleFunc (rotateHex); break;

case GLUT_RIGHT_BUTTON: // Остановить вращение.

if (action == GLUT_DOWN) glutldleFunc (NULL); break; default: break;

}

}

void main (int argc, char** argv) { glutlnit (&argc, argv);

glutlnitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutlnitWindowPosition (150, 150); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример анимации");

init ( ) ;

glutDisplayFunc (displayHex); glutReshapeFunc (winReshapeFcn); glutMouseFunc (mouseFcn);

glutMainLoop ( );

}

РЕЗЮМЕ

Агам ационную последовательность можно строить кадр за кадром или же генерировать в реальном времени. Если отдельные кадры анимационной последовательности строятся и записываются, их можно позже преобразовать в фильм или показать в быстром темпе на мониторе. Ашм ация, включающая сложные сцены и движения, обычно создается покадрово, тогда как более простые движущиеся последовательности отображаются в реальном времени.

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


⇐ вернуться назад | | далее ⇒