void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[l], 0.0, 1.0, 0.0); glRotatef(theta[2], 0.0, 0.0, 1.0); colorcube(); glutSwapBuffers();
}
В функции обработки событий мыши mouse ( ) выбирается ось вращения:
void mouse(int btn, int state, int x, int y)
{
if(btn==GLUT_LEFT_BUTTON && state == GLUT_D0WN) axis = 0; if(btn==GLUT_MIDDLE_BUTTON state == GLUT_DOWN) axis = 1; if(btn==GLUT_RIGHT_BUTTON && state == GLUT_D0WN) axis = 2;
}
В функции обработки простоя выполняется приращение на 2° угла поворота, связанного с текущей осью:
void spinCube() {
theta[axis] += 2.0;
if( theta[axis] > 360.0 ) theta[axis] -= 360.0; displayO;
}
Завершается выполнение программы нажатием клавиши на клавиатуре. Это событие обрабатывается функцией mykey ( ) :
void mykey(char key, int mousex, int mousey) {
if(key=='q'I|key=='Q') exit();
}
Обсуждение алгоритмов удаления невидимых поверхностей мы отложим до главы 5, но сейчас нужно отметить, что с точки зрения прикладного программиста эта задача решается в программах OpenGL очень просто. От него требуется только очистить буфер глубины (depth buffer) и разрешить работу алгоритма вызовом glEnable(GL_DEPTH_TEST). Полный текст программы вы найдете в приложении А.
4.9. Матрицы преобразований в OpenGL
4.9.6. Загрузка матриц и использование стека матриц
Хотя в большинстве случаев для формирования матрицы преобразования вполне достаточно функций поворота, сдвига и масштабирования, в некоторых ситуациях приходится формировать матрицу поэлементно. В частности, это приходится делать при формировании матрицы скоса. Точно так же, как матрицу преобразования можно приравнять к единичной матрице, в нее можно загрузить и произвольную 4х4-матрицу однородных координат. Для этого в составе OpenGL имеется функция
glLoadMatrixf(myarray)
Аргументом функции glLoadMatrixf ( ) является указатель на загружаемый массив. Текущую матрицу, выбранную с помощью glMatrixMode( ), можно домножить справа на произвольную матрицу, определенную в прикладной программе. Это выполняется с помощью функции gMultMatrixf (myarray). Аргумент myarray представляет собой одномерный массив из 16 чисел, в котором элементы матрицы представлены по столбца». Так, если необходимо сформировать в массиве myarray элементы матрицы M (речь идет только о матрицах размером 4x4), то это делается следующим образом: GLfloat myarray[16];