Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КГД шпоры.docx
Скачиваний:
3
Добавлен:
01.08.2019
Размер:
131 Кб
Скачать
☆
  1. Дать определение понятия полигональная модель (вершины, полигоны, полигональные поверхности, каркасные модели).

Полигональная модель – объект, который задается набором полигонов (иначе именуемых полигональными гранями) и потому объединяет множество таких однотипных элементов, или подобъектов, как вершины (Vertex), ребра (Edge) и грани (Face):

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

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

Полигональная сетка — объект в трехмерной графике, представляющий собой совокупность вершин и полигонов, который определяет форму отображаемого многогранного объекта.

Каркасная модель — модель объекта в трехмерной графике, представляющая собой совокупность вершин и ребер, которая определяет форму отображаемого многогранного объекта.

  1. Алгоритм z-буфера.

Z-буферизация — в компьютерной трёхмерной графике, способ учёта удалённости элемента изображения.

Z-буфер представляет собой двумерный массив, каждый элемент которого соответствует пикселу на экране. Когда видеокарта отрисовывает пиксель, его удалённость просчитывается и записывается в ячейку Z-буфера. Если пиксели двух рисуемых объектов перекрываются, то их значения глубины сравниваются, и рисуется тот, который ближе, а его значение удалённости сохраняется в буфер. Получаемое при этом графическое изображение носит название z-depth карта.

  1. Алгоритмы разделения пространства.

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

Рассмотрим метод разделения объектного пространства, который называется octree (от латинского octa - восемь, и английского tree - дерево). Восьмеричное дерево. Данный алгоритм производит разделение объектного пространства на восемь подпространств. Общую схему работы можно представить следующими шагами:

1) Помещаем всю сцену в выровненный по осям куб. Этот куб описывает все элементы сцены и является корневым (root) узлом дерева.

2) Проверяем количество примитивов в узле, и если полученное значение меньше определённого порогового, то производим связывание (ассоциацию) данных примитивов с узлом. Узел, с которым ассоциированы примитивы, является листом (leaf).

3) Если же количество примитивов, попадающих в узел, больше порогового значения, производим разбиение данного узла на восемь подузлов (подпространств) путём деления куба двумя плоскостями. Мы распределяем примитивы, входящие в родительский узел, по дочерним узлам. Далее процесс идёт рекурсивно, т. е. для всех дочерних узлов, содержащих примитивы, выполняем пункт 2.

Данный процесс построения дерева может содержать несколько условий прекращения рекурсии:

1) Если количество примитивов в узле меньше или равно пороговому значению.

2) Если рекурсия (количество делений) достигла какой-то определённой глубины вложенности.

3) Если количество созданных узлов достигло порогового значения.

А теперь о том, как же именно применение данного алгоритма может помочь быстро откинуть части невидимой геометрии. Те элементы, что отображаются при рендеринге на экране, попадают в так называемый viewing frustum - пространство видимости

Теперь, в процессе рендеринга мы рекурсивно выполняем следующую процедуру: начиная с базового (root) куба, мы проверяем, попадает ли данный куб в поле зрения (viewing frustum). Если НЕТ - на этом всё и заканчивается, если же ДА - перемещаемся вглубь рекурсии на один шаг, т. е. поочерёдно проверяем видимость каждого из восьми подузлов корневого узла и т. д. Преимущество заключается в том, что если определено, что данный узел не виден, то можно смело не выводить и всю геометрию этого узла - она тоже будет не видна. Таким образом, ценой всего лишь нескольких проверок, мы отбросим значительную часть сцены. А в случае, если не виден корневой узел, на экран не будет выведено ничего. Сплошная экономия!

К сожалению, от достоинств алгоритма нужно перейти к его недостаткам, коих немало. Первый из них - это возможное деления примитива ребрами кубов дерева. Если примитив не полностью лежит в узле, его индекс заносится в отдельный массив. В процессе рендеринга ведётся учёт всех отрисованных "дробных" примитивов в специальном буфере, и если при выводе данного треугольника его индекс совпадёт с одним из индексов в буфере, мы не рисуем этот треугольник. Как показал опыт, помечать примитивы не так уж медленно, гораздо более медленно выводить геометрию три-четыре раза подряд.

Всё бы хорошо, да с делением примитива есть ещё одна проблема. Допустим, узлы I, II и III не видны. Однако узел IV может всё же попадать в поле зрения камеры, и видно, что частичка полигона всё же может выпасть. Что делать? Очевидно, что нельзя относить примитив к узлу, ориентируясь только на факт принадлежности вершины примитива к этому узлу. Наверное, все же вместо этого надо проверять, проходит ли РЕБРО примитива через пространство узла. Это может потребовать гораздо больше времени при построении дерева, но зато мы избежим выпадения полигонов. Кстати, структуру один раз построенного дерева можно записать в файл, и уже больше не строить его каждый раз при старте программы, а загружать из файла. В приведённом случае полигон придётся отнести ко всем четырём узлам.

Второй недостаток octree-дерева - это вывод всех объектов, находящихся в поле viewing frustum, но на самом деле в конечном счёте невидимых. По-видимому, чистым octree-based алгоритмом здесь не обойтись, необходимо дополнительно реализовать так называемый Z-buffer

Так же применяется Quadtree – задачи о туннелях (видим только часть туннеля перед нами, а все, что за спиной – не видим). BSP – бинарное дерево – плоские задачи.