|
Примитивы библиотек 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 Все материалы защищены законодательством РФ.
|