glFlush();
glutSwapBuffers();
}
/*.....-----------------.........*/
void spinCube() {
/* Программа обработки простоя.
* Программа поворачивает куб на 2 градуса
* вокруг заданной оси. */
theta[axis] += 2.0;
if( theta[axis] > 360.0 ) theta[axis] -= 360.0; glutPostRedisplay();
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_DOWN) axis = 2;
/*
*/
/* -------------------------
void myReshape(int w, int h)
*/
Приложение А. Демонстрационные программы
glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h)
glOrtho(-2.0, 2.0, -2.0*(GLfloat)h/(GLfloat)w,
2.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho(-2.0 *(GLfloat)w/(GLfloat)h, 2.0 *(GLfloat)w/(GLfloat)h, -2.0, 2.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW);
}
/*----------........_............*/
void main(int argc, char **argv) {
/* Задается режим двойной буферизации и обработки z-буфера */ glutlnit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("colorcube");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutldleFunc(spinCube);
glutMouseFunc(mouse);
glEnable(GL_DEPTH_TEST); /* Разрешается режим удаления */
/* невидимых поверхностей */ glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glColorPointer(3,GL_FLOAT, 0, colors); glNormalPointer(GL_FLOAT,0, normals); glColor3f(1.0,1.0,1.0); glutMainLoop();
}
/*-------Конец файла-------*/
A. 10. Вращающийся куб, управляемый трекболом
/* Программа демонстрирует использование трекбола для управления вращением куба */
tinclude <math.h> #include <GL/glut.h>
idefine bool int idefine false 0