glPopMatrix ();
}
}
void drawBodyAndWheelAndBolts () {
drawCarBody (); glPushMatrix ();
glTranslatef ( 40.0, 0.0, 30.0 ); drawWheelAndBolts (); glPopMatrix (); glPushMatrix ();
glTranslatef ( 40.0, 0.0, -3 0.0 ) ; drawWheelAndBolts (); glPopMatrix ();
...... // draw last 2 wheels similarly
}
Приведем пример построения анимации с использованием библиотеки
glut.
а
void init () {
glClearColor ( 0.0, 0.0, 0.0, 1.0 ); glEnable ( GL_DEPTH_TEST );
}
void animate () {
angle += 0.5f; glutPostRedisplay ();
}
void display () {
glClear ( GL_COLOR_BUFFER_BIT | GL_PEPTH^BUFFER_BIT ); glPushMatrix ();
glTranslatef ( 1.5f, 1.5f, 1.5f ) ;
// move cube from the center
Основы библиотеки OpenGL
glRotatef ( angle, l.Of, l.Of, O.Of ),; glTranslatef ( -1.5f, -1.5f, -1.5f );
// move cube into the center
drawBox (.1,2,1,2,1,2);
glPopMatrix () ;
glutSwapBuffers () ;
}
void reshape ( int w, int h ) {
glViewport ( 0, 0, (GLsizei)w, (GLsizei)h );
glMatrixMode ( GL_PROJECTION ); glLoadldentity ();
gluPerspective ( 60.0, (GLfloat)w/(GLfloat)h, 1.0, 60.0 );
glMatrixMode ( GLJflODELVIEW ); glLoadldentity ();
gluLookAt . (0.0, 0.0, 0.0, // eye
1.0, 1.0, 1.0, // center
0.0, 1.0, 0.0 );
}
void key ( unsigned char key, int x, int y )
{
if ( key ==27 || key == 'g' || key == 'Q' ) exit ( 0 ); // quit requested
}
int main ( int arge, char** argv )
{
// initialise glut glutlnit ( targe, argv ) ,-
glutlnitDisplayMode ( GLUT_PÖUBLE | GLUT_RGB | GLUT_PEPTH ); glutlnitWindowSize ( 400, 400 ) ;
// create window int GLwin = glutCreateWindow ( "OpenGL example 3" );
initO ;
// register handlers glutDisplayFunc ( display );
Д. Д. Боресков. Графики трехмерной компьютерной игры
glutReshapeFunc ( reshape ); glutKeyboardFunc ( key ); glutldleFunc ( animate );
glutMainLoop ();
return 0;
}
Дисплейные списки В традиционных языках программирования существуют функции и процедуры - т. е. можно выделить определенный набор команд, запомнить его в некотором одном определенном месте и вызывать каждый раз, когда возникает потребность в соответствующей последовательности команд. Подобная возможность существует и в OpenGL - набор команд OpenGL можно запомнить в так называемый дисплейный список (display list), при этом все команды и данные переводятся в некоторое внутреннее представление, наиболее удобное для данной реализации OpenGL, и затем вызвать при помощи всего одной команды.