gluQuadricNormals (quadricName, generationMode); Параметру generationMode присваивается значение символьной константы, указывающей, как должны генерироваться векторы нормали к поверхности. Значение по умолчанию - GLU_NONE, означающее, что векторы нормали не генерируются, кроме того, обычно на поверхность второго порядка не налагаются условия освещенности. Для затенения плоской поверхности (с каждой поверхностью соотносится постоянный код цвета) используется символьная константа GLU_FLAT. В результате для каждой многоугольной грани генерируется одна нормаль. Если нужно применить другие условия освещения и затенения, используется константа GLU_SMOOTH, и для каждой вершины поверхности генерируется вектор нормали.
Кроме того, для поверхностей второго порядка GLU можно установить параметры поверхностной текстуры, также можно задать функцию, которая будет вызываться при ошибке в процессе генерации поверхности второго порядка:
gluQuadricCallback (quadricName, GLU_ERROR, function);
Рис. 8.8. Изображение сферы GLUT, конуса GLUT и цилиндра GLU, размещенных в окне с помощью процедуры wire-QuadSurfs
ПРИМЕР ПРОГРАММЫ С ИСПОЛЬЗОВАНИЕМ ФУНКЦИЙ GLUT И GLU ДЛЯ СОЗДАНИЯ ПОВЕРХНОСТЕЙ ВТОРОГО ПОРЯДКА
Приведенная ниже программа отображает три каркасных поверхности второго порядка (сфера, конус и цилиндр). Направление наблюдения совпадает с положительным направлением оси г, так что оси всех отображенных объектов направлены вертикально. Три объекта размещены в различных точках в пределах одного окна экрана, как показано на рис. 8.8.
♦include <GL/glut.h>
GLsizei winWidth = 500, winHeight = 500;
/* Размер исходного окна на экране дисплея. */ void init (void){
glClearColor (1.0, 1.0, 1.0, 0.0); // Задается цвет окна.
}
void wireQuadSurfs (void){
glClear (GL_COLOR_BUFFER _BIT); // Окно очищается.
glColor3f (0.0, 0.0, 1.0); // Цвет линии выбран синим.
/* Направление наблюдения задается по оси z внешней
* системы координат.
*/
gluLookAt (2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
/* Размещается и отображается каркасная сфера GLUT. */ glPushMatrix ( ); glTranslatef (1.0, 1.0, 0.0); glutWireSphere (0.75, 8, б); glPopMatrix ( );
/* Размещается и отображается каркасный конус GLUT. */
glPushMatrix ( );
glTranslatef (1.0, -0.5, 0.5);
glutWireCone (0.7, 2.0, 7, 6);
glPopMatrix ( );
/* Размещается и отображается каркасный цилиндр GLU. */ GLUquadricObj ♦cylinder; // Задается имя объекта GLU. glPushMatrix ( ); glTranslatef (0.0, 1.2, 0.8); cylinder = gluNewQuadric ( ); gluQuadricDrawStyle (cylinder, GLU_LINE); gluCylinder (cylinder, 0.6, 0.6, 1.5, 6, 4); glPopMatrix ( ); glFlush ( );
void winReshapeFcn (GLint newWidth, GLint newHeight)
{
glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glOrtho (-2.0, 2.0, -2.0, 2.0, 0.0, 5.0); glMatrixMode (GL_MODELVIEW); glClear (GL_COLOR_BUFFER_BIT);
)
void main (int argc, char** argv) glutlnit (&argc, argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Каркасные квадратичные поверхности"); init ( );