Сделай Сам Свою Работу на 5

Примитивы библиотек GLU и GLUT





Рассмотрим стандартные команды построения примитивов, которые реализованы в библиотеках GLU и GLUT.

Чтобы построить примитив из библиотеки GLU, надо сначала создать указатель на quadric-объект с помощью команды gluNewQuadric(), а затем вызвать одну из команд: gluSphere(), gluCylinder(), gluDisk(), gluPartialDisk(). Рассмотрим эти команды отдельно (табл. 3.2).

Таблица 3.2. Функции библиотеки GLU

Название функции Назначение
void gluSphere( GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks) Эта функция строит сферу с центром в начале координат и радиусом radius. При этом число разбиений сферы вокруг оси z задается параметром slices, а вдоль оси z – параметром stacks.
void gluCylinder( GLUquadricObj *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks)   Данная функция строит цилиндр без оснований (то есть кольцо), продольная ось параллельна оси z, заднее основание имеет радиус baseRadius, и расположено в плоскости z=0, переднее основание имеет радиус topRadius и расположено в плоскости z= height. Если задать один из радиусов равным нулю, то будет построен конус. Параметры slices и stacks имеют аналогичный смысл, что и в предыдущей команде.
void gluDisk( GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops)   Функция строит плоский диск (то есть круг) с центром в начале координат и радиусом outerRadius. При этом если значение innerRadius отлично от нуля, то в центре диска будет находиться отверстие радиусом innerRadius. Параметр slices задает число разбиений диска вокруг оси z, а параметр loops – число концентрических колец, перпендикулярных оси z.
void gluPartialDisk( GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops, GLdouble startAngle, GLdouble sweepAngle) Отличие этой функции от предыдущей заключается в том, что она строит сектор круга, начальный и конечный углы которого отсчитываются против часовой стрелки от положительного направления оси y и задаются параметрами startAngle и sweepAngle. Углы измеряются в градусах.

 



Команды, проводящие построение примитивов из библиотеки GLUT, реализованы через стандартные примитивы OpenGL и GLU. Для построения нужного примитива достаточно произвести вызов соответствующей команды. Объект каждого типа может быть создан в двух режимах – в виде сплошной трехмерной фигуры или каркасного объекта (для каркасного объекта фрагмент «Solid» в названии функции заменяется на «Wire»).




Таблица 3.2. Функции библиотеки GLUT

Название функции Назначение
void glutSolidSphere ( GLdouble radius, GLint slices, GLint stacks) Функция glutSolidSphere() строит сферу, а glutWireSphere() – каркас сферы радиусом radius. При этом число разбиений сферы вокруг оси z задается параметром slices, а вдоль оси z – параметром stacks.
void glutSolidCube( GLdouble size) Построение куба или каркаса куба с центром в начале координат и длиной ребра size.
void glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks) Функция строит конус или его каркас высотой height и радиусом основания base, расположенный вдоль оси z. Основание находится в плоскости z=0.
void glutSolidTorus( GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings) Построение тора или его каркаса в плоскости z=0. Внутренний и внешний радиусы задаются параметрами innerRadius, outerRadius. Параметр nsides задает число сторон в кольцах, составляющих ортогональное сечение тора, а rings – число радиальных разбиений тора.
void glutSolidTetrahedron (void) void glutWireTetrahedron (void) Функции строят тетраэдр (правильную треугольную пирамиду) или его каркас, при этом радиус описанной сферы вокруг него равен 1.
void glutSolidOctahedron (void) void glutWireOctahedron (void) Построение октаэдра или его каркаса, радиус описанной вокруг него сферы равен 1.
void glutSolidDodecahedron (void) void glutWireDodecahedron (void) Функции строят додекаэдр или его каркас, радиус описанной вокруг него сферы равен квадратному корню из трех.
void glutSolidIcosahedron (void) void glutWireIcosahedron (void) Построение икосаэдра или его каркаса, радиус описанной вокруг него сферы равен 1.

 

Для корректного построения перечисленных примитивов необходимо удалять невидимые линии и поверхности, для чего надо включить соответствующий режим вызовом команды glEnable(GL_DEPTH_TEST).




Рисование геометрических объектов

Процесс обновления изображения

Как правило, задачей программы, использующей OpenGL, является обработка трехмерной сцены и интерактивное отображение в буфере кадра. Сцена состоит из набора трехмерных объектов, источников света и виртуальной камеры, определяющей текущее положение наблюдателя.

OpenGL предоставляет как одинарную, так и двойную буферизацию. Двойная буферизация используется для того, чтобы устранить мерцание при мультипликации, т.е. изображение каждого кадра сначала рисуется во втором (невидимом) буфере, а потом, когда кадр полностью нарисован, весь буфер отображается на экране.

Обычно приложение OpenGL в бесконечном цикле вызывает функцию обновления изображения в окне. В этой функции и сосредоточены вызовы основных команд OpenGL. Если используется библиотека GLUT, то это будет функция с обратным вызовом, зарегистрированная с помощью вызова glutDisplayFunc(). GLUT вызывает эту функцию, когда операционная система информирует приложение о том, что содержимое окна необходимо перерисовать (например, если окно было перекрыто другим). Создаваемое изображение может быть как статичным, так и анимированным, т.е. зависеть от каких-либо параметров, изменяющихся со временем. Как правило, типичная функция обновления изображения состоит из трех шагов:

· очистка буферов OpenGL;

· установка положения наблюдателя;

· преобразование и рисование геометрических объектов.

Типичная программа вызывает команду glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) для очистки буферов цвета и глубины.

Установка положения наблюдателя и преобразования трехмерных объектов (поворот, сдвиг и т.д.) контролируются с помощью задания матриц преобразования.

Рассмотрим способы передачи в OpenGL описания объектов, находящихся в сцене. Каждый объект является набором примитивов OpenGL.

 

Вершины и примитивы

Вершина является атомарным графическим примитивом OpenGL и определяет точку, конец отрезка, угол многоугольника и т.д. Все остальные примитивы формируются с помощью задания вершин, входящих в данный примитив. Например, отрезок определяется двумя вершинами, являющимися концами отрезка.

С каждой вершиной ассоциируются ее атрибуты. В число основных атрибутов входят положение вершины в пространстве, цвет вершины и вектор нормали.

 

Положение вершины в пространстве

Положение вершины определяются заданием ее координат в двух-, трех-, или четырехмерном пространстве (однородные координаты). Это реализуется с помощью нескольких вариантов команды glVertex:

· void glVertex[2 3 4][s i f d] (type coords);

· void glVertex[2 3 4][s i f d]v (type coords).

Каждая команда задает четыре координаты вершины: x, y, z, w (w – нормирующий коэффициент, на который делятся остальные координаты). Команда glVertex2 получает значения x и y. Координата z в таком случае устанавливается по умолчанию равной 0, координата w – равной 1. Vertex3 получает координаты x, y, z и заносит в координату w значение 1. Vertex4 позволяет задать все четыре координаты.

Цвет вершины

Для задания текущего цвета вершины используются команды:

· void glColor[3 4][b s i f] (GLtype components);

· void glColor[3 4][b s i f]v (GLtype components).

Первые три параметра задают R, G, B компоненты цвета, а последний параметр определяет коэффициент непрозрачности (так называемая альфа-компонента). Если в названии команды указан тип «f» (float), то значения всех параметров должны принадлежать отрезку [0,1], при этом по умолчанию значение альфа - компоненты устанавливается равным 1.0, что соответствует полной непрозрачности. Тип «ub» (unsigned byte) подразумевает, что значения должны лежать в отрезке [0;255].

Вершинам можно назначать различные цвета, и, если включен соответствующий режим, то будет проводиться линейная интерполяция цветов по поверхности примитива.

 

Нормали

Определить нормаль в вершине можно, используя команды:

· void glNormal3[b s i f d] (type coords)

· void glNormal3[b s i f d]v (type coords)

Для правильного расчета освещения необходимо, чтобы вектор нормали имел единичную длину. Командой glEnable(GL_NORMALIZE) можно включить специальный режим, при котором задаваемые нормали будут нормироваться автоматически.

Режим автоматической нормализации должен быть включен, если приложение использует модельные преобразования растяжения/сжатия, так как в этом случае длина нормалей изменяется при умножении на модельно-видовую матрицу.

Однако применение этого режима уменьшает скорость работы механизма визуализации OpenGL, так как нормализация векторов имеет заметную вычислительную сложность (взятие квадратного корня и т.п.). Поэтому лучше сразу задавать единичные нормали.

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.