Chapter 4
Полезные и бесполезные мелочи

4.1  Построение поверхностей

     Существует набор функций для построения сфер, цилиндров и дисков. Эти функции представляют очень мощный контроль за построением трехмерных объектов. Непосредственно рисовать вы будете, используя следующие функции: gluSphere, gluCylinder, gluDisk и gluPartialDisk. В начале книги вы научились строить трехмерные объекты с помощью функций из библиотеки Auxilary Library. Функции aux[Solid/Wire]Sphere, aux[Solid/Wire]Cylinder и aux[Solid/Wire]Cone просто вызывают gluSphere и gluCylinder. Как я уже ранее говорил, в aux[Solid/Wire]Cylinder и aux[Solid/Wire]Cone фирмы Microsoft имеются баги. Здесь будет подробно рассмотрено построение сфер и цилиндров, так что потребность в aux[Solid/Wire]Cylinder и aux[Solid/Wire]Cone отпадет.
     Первым параметром для gluSphere, gluCylinder, gluDisk является указатель на объект типа GLUquadricObj. Далее следуют параметры непосредственно создаваемой фигуры. Для сферы - это радиус; для цилиндра - радиус нижнего основания, радиус верхнего основания и высота; для диска - внутренний радиус, внешний радиус и для частичного диска - внутренний радиус, внешний радиус, угол, с которого начинать рисовать, длина дуги в градусах, которую рисовать. Последние два параметра у всех этих функций одинаковы. Это число разбиений вокруг оси Z и число разбиений вдоль оси Z. Как я уже говорил, все сложные объекты состоят из простых: точек, линий и многоугольников. Вы понимаете, что нарисовать/создать идеально гладкую сферу или цилиндр невозможно. Поэтому строится приближение из плоскостей. Для этого и нужно указать количество разбиений. Чем больше разбиение, тем лучше будет выглядеть ваша сфера. Однако, задавать здесь число с шестью нулями не стоит. Это лишено всякого смысла. Оптимальным, на мой взгляд, является число от 10 до 20. Чем больше объект, тем больше нужно разбиений. Число разбиений вдоль и поперек я выставляю одинаковыми. Сначала вы должны создать объект типа GLUquadricObj с помощью функции gluNewQuadric. Теперь устанавливаете свойства с помощью функции gluQuadricDrawStyle. Доступны стили: GLU_FILL - рисуется сплошной объект, GLU_LINE - проволочный объект, GLU_POINT - рисуются только точки. Рисуете то, что хотите. И не забудьте удалить созданный объект, воспользовавшись gluDeleteQuadric.

Настало время поэкспериментировать. Создайте очередное консольное приложение и отредактируйте функцию display следующим образом.

void CALLBACK display(void)
{
 GLUquadricObj *quadObj; 

 quadObj = gluNewQuadric(); // создаем новый объект 
                            // для создания сфер и цилиндров
                              
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

 
                          
glPushMatrix(); 
 glColor3d(1,0,0);
  gluQuadricDrawStyle(quadObj, GLU_FILL); // устанавливаем
                          // стиль: сплошной

 gluSphere(quadObj, 0.5, 10, 10); // рисуем сферу
                                  // радиусом 0.5
 glTranslated(-2,0,0); // сдвигаемся влево
 glRotated(45, 1,0,0); // поворачиваем
 glColor3d(0,1,0);
 gluQuadricDrawStyle(quadObj, GLU_LINE); // устанавливаем
                          // стиль: проволочный

 gluCylinder(quadObj, 0.5, 0.75, 1, 15, 15);    
glPopMatrix();
 
gluDeleteQuadric(quadObj);
auxSwapBuffers();
}