if(btn==GLUT_LEFT BUTTON && State == GLUT DOWN) axis = 0; if(btn==GLUT MIDDLE BUTTON && state == GLUT DOWN) axis = 1; if (btn«GLUT~RIGHT_BUTTON && state == GLUTJDOWN)
axis = 2; theta[axis] += 2.0; if( theta[axis] > 360.0 )
theta[axis] -= 360.0; display();
)
/*.................--............*/
void keys(unsigned char key, int x, int y)
{
/* Положением наблюдателя управляют клавиши х, X, у, Y, z, Z */
if(key == 'х') viewer[0]-= 1.0; if(key == 'X') viewer[0)+= 1.0;
A.ll. Изменение положения наблюдателя
if(key == 'у') viewer[l]-= 1.0; if(key == 'Y') viewer[l]+= 1.0; if(key == 'z') viewer[2]-= 1.0; if(key == 'Z') viewer[2]+= 1.0; display();
}
/*----------........------.....__ */
void myReshape(int w, int h) {
glviewport(0, 0, w, h);
/* Режим перспективной проекции */
glMatrixMode(GL_PROJECTION); glLoadIdentity();
if(w<=h) glFrustum(-2.0, 2.0, -2.0*(GLfloat)h/(GLfloat)w,
2.0*(GLfloat)h/(GLfloat)w, 2.0, 20.0); else glFrustum(-2.0, 2.0, -2.0*(GLfloat)w/(GLfloat)h,
2.0*(GLfloat)w/(GLfloat)h, 2.0, 20.0);
/* Можно использовать и функцию gluPerspective() */ /* gluPerspective(45.0, w/h, 1.0, 10.0); */
glMatrixMode(GL_MODELVIEW);
}
/*----------.......--------------*/
void main(int arge, char **argv) {
glutlnit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUTJDEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("colorcube");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keys);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
}
/*-------Конец файла-------*/
A. 12. Построение сферы
/* Построение сферы рекурсивным разбиением тетраэдра. Программа подробно рассматривалась в главе 6. */
/* Режим 0 - каркасное изображение, Режим 1 - постоянная закраска граней, Приложение А. Демонстрационные программы
Режим 3 - закраска граней с интерполяцией цвета */
iinclude <stdlib.h> iinclude <GL/glut.h>
typedef float point[4];
/* Исходный тетраэдр */
point3 v[]={{0.0, 0.0, 1.0}, {0.0, 0.942809, -0.33333}, {-0.816497, -0.471405, -0.333333}, {0.816497, -0.471405, -0.333333}};