Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

675

.pdf
Скачиваний:
1
Добавлен:
06.12.2022
Размер:
4.11 Mб
Скачать

1 2

Рис. 3. Варианты заданий

Лабораторная работа № 2 ПОСТРОЕНИЕ СЛОЖНЫХ ФИГУР С ИСПОЛЬЗОВАНИЕМ

ПОЛИГОНОВ (ТРЕУГОЛЬНИКОВ, ЧЕТЫРЕХУГОЛЬНИКОВ И МНОГОУГОЛЬНИКОВ)

Цель работы:ознакомиться сприемамиформирования фигур любой сложности на плоскости с помощью комбинации простейших элементов (треугольников, четырехугольников и полигонов); ознакомиться с атрибутами этих примитивов.

Теоретическая часть

Функции рисования OpenGL непосредственно позволяют рисовать только выпуклые фигуры. Сложные изображения получаются путем комбинирования стандартных выпуклых примитивов. Вэтомслучае заботаосозданиитакихфигурполностью лежит на программисте. Стандартные примитивы описываются необходимым количеством вершин. Например, для рисования треугольника необходимо указать кратное трем количество вершин (минимум — три вершины). Лишние вершины игнорируются. Например, если для треугольника указать две вершины, то ничего не будет создано, если указать пять вершин — будет создан только один треугольник и т.д.

Вид примитива задается соответствующим параметром в операторныхскобках glBegin()…glEnd.Варианты задания примитивов приведены нарис. 4и втабл.3. Следуетобратитьвнимание на порядок задания вершин в различных режимах отображения полигонов.

Посколькурассматриваемыепримитивы являются плоскостями, то они имеют ряд особенностей, требующих учета уже на стадии описания вершин. В частности для них существуют понятия лицевой и нелицевой граней, каждая из которых может по-разному отображаться на экране (например, с полной заливкой или только контуром). Лицевая и нелицевая грани полигона определяются порядком задания его вершин при взгляде на плоскость грани — против часовой стрелки (по умолчанию) или по часовой стрелке. Эффект различия граней одной плоскости часто бывает полезен при визуализации объемных фигур, построении разрезов и сечений.

2 2

Рис. 4. Варианты задания примитивов «Треугольник», «Четырехугольник», «Многоугольник» [1]

 

Таблица 3

 

 

 

 

Треугольники

 

Рисует серию треугольников, используя вершины V0, V1 и V2

 

GL_TRIANGLES

(рис. 4), затем V3, V4 и V5 и т.д. Если n не кратно трем, то

 

лишние вершины игнорируются

 

Рисует ряд треугольников, где каждый из последующих

 

 

треугольников имеет общую сторону с предыдущим.

 

Например, первый треугольник строится по вершинам V0, V1

GL_TRIANGLE_STRIP

и V2 (рис. 4), следующий – по вершинам V2, V1 и V3

(сохраняя при этом то же направление обхода вершин), и

 

 

т.д. Таким образом, для задания двух треугольников надо

 

указать только четыре вершины. Этот прием целесообразно

 

использовать при построении поверхностей

 

Рисует ряд треугольников с одной общей вершиной (веер):

 

GL_TRIANGLE_FAN

V0, V1 и V2 (рис. 4), затем V0, V2, V3, затем V0, V3, V4 и т.д.

 

Часто используется при построении круглых дисков

 

Четырехугольники

 

 

Рисует серию несвязанных четырехугольников, используя

 

GL_QUADS

вершины V0, V1, V2, V3, затем V4, V5, V6, V7, и т.д. Если число

 

вершин не кратно четырем, лишние вершины игнорируются

 

Рисует серию четырехугольников, где каждый

 

 

последующий четырехугольник имеет общую сторону с

 

предыдущим. Направление обхода вершин при этом

GL_QUAD_STRIP

остается одинаковым. Например, первый четырехугольник

строится по вершинам V0, V1, V3, V2 (рис. 4), затем V2, V3, V5,

 

 

V4, затем V4, V5, V7, V6 и т.д. Число вершин должно быть не

 

меньше четырех, иначе ничего не будет нарисовано. Если

 

число вершин нечетно, последняя вершина игнорируется

 

2 3

Окончание табл. 3

Полигоны (многоугольники)

Рисует многоугольник, используя точки V0, V1, V2, ..., Vn–1 в качестве вершин. Число вершин должно быть не меньше трех,

GL_POLYGON

иначе ничего нарисовано не будет. Описываемый многоугольник не должен иметь самопересечений и должен быть выпуклым. Если вершины не удовлетворяют этим условиям, результат непредсказуем

Направление обхода вершин лицевых граней можно изменить вызовом команды

glFrontFace (GLenum mode),

где параметр mode принимает значения:

mode = GL_CW (clockwise — по часовой стрелке);

mode = GL_CCW (counter-clockwise— противчасовой стрел-

ки, по умолчанию).

Каждый полигон может быть отображен с полной заливкой (цветом или штриховкой), в виде контурных линий или обозначен только угловыми точками. Режим отображения задается функцией

glPolygonMode (GLenum face, Glenum mode),

где параметр face определяет, для какой грани полигона (лицевой или нелицевой) назначается режим отображения; параметр mode собственно устанавливает режим отображения.

Параметры face и mode могут принимать следующие значения

(табл. 4).

 

 

Таблица 4

 

 

 

Параметр

Значение

Режим отображения

face

GL_FRONT

Назначает воздействие на лицевую сторону

 

 

полигона

 

GL_BACK

Назначает воздействие на нелицевую

 

 

сторону полигона

 

GL_FRONT_AND_BACK

Назначает воздействие на обе стороны

 

 

полигона

mode

GL_FILL

Заполняет полигон сплошным цветом или

 

 

штриховкой

 

GL_LINE

Полигон отображается контурными

 

 

линиями

 

GL_POINT

Полигон отображается угловыми точками

В режимах отображения полигона контуром и угловыми точками на толщину линий контура (и размер угловых точек)

оказывают влияние функции glLineWidth () и glPointSize ()

соответственно.

2 4

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

glEnable (GL_CULL_FACE),

а затем выбрать тип отображаемых граней с помощью команды glCullFace (GLenum mode),

где параметр mode = GL_FRONT приводит к удалению из изображения всех лицевых граней, а mode = GL_BACK — нелицевых (по умолчанию).

Стандартным набором примитивов можно строить изображения сколь угодно сложных фигур. При этом в случае отображения полигонов контурными линиями (режим GL_LINE функции glPolygonMode ()) это приведет нарушению иллюзии монолитности сложной модели — будет виден каждый составляющий эту модель полигон. Во избежание такого эффекта применяется функция glEdgeFlag () для исключения рисования лишних вершин.

glEdgeFlag (FALSE) — отключить режим отображения вершин;

glEdgeFlag (TRUE) — включить режим отображения вершин. Все вершины, описанные между этими двумя вызовами функ-

ции glEdgeFlag (), отображены не будут:

создаем один прямоугольник двумя прямоугольниками glBegin (GL_ QUADS);

glEdgeFlag (TRUE); glVertex2f (-1, -1); glVertex2f (-1, 1);

glEdgeFlag (FALSE); // эти вершины не включать glVertex2f (0, 1);

glVertex2f (0, -1); glEnd;

glBegin (GL_ QUADS); glVertex2f (0, -1); glVertex2f (0, 1); glEdgeFlag (TRUE); glVertex2f (1,1); glVertex2f (1,-1);

glEnd;

2 5

При составлении сложных фигур следует иметь в виду, что если не используется буфер глубины, то на экране полигоны будут появляться в порядке описания. Это значит, что позднее нарисованный полигон будет закрывать нарисованный ранее.

Варианты заданий

Написать программу рисования сложных фигур с помощью трех- и четырехугольников (рис. 5). Во всех вариантах фигура вписывается в окно формы, имеющее координаты нижнего левого угла [–1; –1] и верхнего правого — [1; 1]. Форма должна иметь переключатель режимов отображения полигонов (с заливкой, контуром или угловыми точками), а также элементы управления цветовой заливкой (в том числе — различными цветами в вершинах). В контурном режиме должна быть возможность просмотра контура всей фигуры и отдельных составляющих.

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

Контрольные вопросы

1.Какие фигуры позволяют рисовать функции OpenGL?

2.Приведите примеры разных методик построения фигур и использованием примитива «Треугольник».

3.Приведите примеры разных методик построения фигур и использованием примитива «Четырехугольник».

4.Как при описании полигона задаются грани? Какие грани бывают у полигона?

5.Каким образом и для чего задается направление обхода вершин при построении полигона?

6.Приведите примеры различных режимов отображений полигона.

7.Для чего используется функция glPolygonMode?

8.Что обозначает понятие «буфер глубины»?

9.Приведите пример методики построения круга.

10.Приведите примеры изменения цвета полигонов.

11.Можно ли, используя GL_POLYGON, построить невыпуклую фигуру? Если можно, то приведите пример.

2 6

Рис. 5. Варианты заданий

2

7

Лабораторная работа № 3 ГЕОМЕТРИЧЕСКИЕ ПРЕОБРАЗОВАНИЯ НА ПЛОСКОСТИ

Цель работы:ознакомиться сосновнымимодельно-видовыми преобразованиями объектов на плоскости — перемещением, поворотом, масштабированием.

Теоретическая часть

Для отображения трехмерных объектов сцены в окно приложения используется последовательность преобразований координат модели в координаты экрана, показанная на рис. 6.

Мировые координаты

Модельно-видовое преобразование

Модельно-видовая матрица

Видовые координаты

Преобразование проекции

Матрица

и нормализация

проекции

Нормализованные координаты

 

Преобразование к области

Параметры

области вывода

вывода

(glViewport)

Оконные координаты

Рис. 6. Общий алгоритм преобразований координат объекта

Преобразования координат модели (вида) выполняются в пространстве координатмодели (в общем случае— трехмерном) и сводятся к переносу, повороту и изменению масштаба отображаемого объекта. С помощью проекционных преобразований выполняют проецирование трехмерной модели на картинную плоскость.Послеприменения матрицы проекцийполучаются так называемые усеченные координаты (xc, yc, zc, wc)T. Затем находятся нормализованные координаты вершин:

(xn, yn, zn)T = (xc/wc, yc/wc, zc/wc)T.

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

2 8

Преобразования координат производятся умножением вектора однородных координат вершины на соответствующую матрицу преобразований:

x

 

 

 

 

x

 

 

 

 

 

 

 

 

y

 

 

M

 

y

 

 

 

 

 

,

z

 

 

 

 

 

z

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

1

 

где |M| — матрица модельно-видового преобразования.

В OpenGL различают три типа матриц — модельно-видовая

(GL_ MODELVIEW), проекций (GL_PROJECTION) и тек-

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

Модельно-видовые преобразования в OpenGL задаются с помощью следующих функций (табл. 5).

 

 

Таблица 5

 

 

 

Перенос

glTranslate[f d] (GLtype dx, GLtype dy,

dx, dy, dz – величины перемещения

 

GLtype dz)

вершин вдоль соответствующих осей

 

 

координат

Поворот

glRotate[f d] (GLtype , GLtype Ux,

– угол поворота (в градусах) вокруг

 

GLtype Uy, GLtype Uz)

оси вращения, по умолчанию

 

 

отсчитывается против часовой

 

 

стрелки;

 

 

Ux, Uy, Uz – координаты второй точки

 

 

на оси вращения (первая точка –

 

 

начало координат):

 

 

{1,0,0} – вращение вокруг оси Х;

 

 

{0,1,0} – вращение вокруг оси Y;

 

 

{0,0,1} – вращение вокруг оси Z

Масшта-

glScale[f d] (GLtype Sx, GLtype Sy,

Sx, Sy, Sz – масштабные множители

бирова-

GLtype Sz)

вдоль соответствующих осей

ние

 

координат:

 

 

Si > 1 – растяжение;

 

 

0 < Si <1 – сжатие;

 

 

Si < 0 – зеркальное отражение

Сброс

glLoadIdentity()

Установление единичной текущей

матрицы

 

матрицы преобразования

преобра-

 

 

зования

 

 

2 9

Математическая запись матриц преобразования

 

 

 

 

 

 

 

 

 

 

 

1

 

0

0

dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Матрица переноса M

 

0

 

1

0

dy .

 

 

 

 

 

 

 

 

 

 

 

 

Translate

 

0

 

0

1

dz

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

1

 

 

 

 

 

Матрица поворота

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c 1 c ux2

 

1 c uyux suz

1 c uzux suy

0

 

M

 

1 c uxuy suz

c 1 c uy2

 

1 c uzuy

sux

0

,

 

 

 

 

u

 

su

 

1 c u

 

u

 

su

 

c 1 c u2

 

 

Rotate

1 c u

 

 

 

 

 

 

0

 

 

 

 

 

x

 

z

 

y

 

 

 

y

 

z

 

 

x

 

0

z

 

 

 

 

 

 

0

 

 

 

 

 

 

0

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

где с = cos ; s = sin .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Sx

0

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Матрица масштабирования MScale

 

 

0

Sy

0

0 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

Sz

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

1

0

 

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Единичная матрица ME

0

 

1

 

0

0

 

 

 

 

 

 

 

 

0

 

1

0

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

1

 

 

 

 

 

Как правило, для достижения желаемой компоновки сцены применяют не единственное преобразование, а комбинацию нескольких последовательных преобразований. Это необходимо еще и потому, что все модельно-видовые преобразования выполняются относительно начала координат. Поэтому, если необходимо, например, выполнить поворот фигуры вокруг произвольной точки, а не вокруг начала координат, то сначала необходимо переместить начало координат в желаемую точку, собственно выполнить поворот и вернуть систему координат назад (рис. 7). Перемещение системы координат также выполняется функцией glTranslate(), но в качестве параметров задаются величины

(-dx, -dy, -dz).

3 0

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]