Учебники

Обнаружение видимой поверхности

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

Существует два подхода к устранению скрытых проблем с поверхностью: метод Object-Space и метод Image-space . Метод Object-space реализован в физической системе координат, а метод image-space реализован в экранной системе координат.

Когда мы хотим отобразить 3D-объект на 2D-экране, нам нужно идентифицировать те части экрана, которые видны с выбранной позиции просмотра.

Метод глубинного буфера (Z-Buffer)

Этот метод разработан Cutmull. Это образно-пространственный подход. Основная идея состоит в том, чтобы проверить Z-глубину каждой поверхности, чтобы определить ближайшую (видимую) поверхность.

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

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

Буфер глубины используется для хранения значений глубины для позиции (x, y), поскольку поверхности обрабатываются (0 ≤ глубина ≤ 1).

Буфер кадра используется для хранения значения интенсивности значения цвета в каждой позиции (x, y).

Координаты z обычно нормированы на диапазон [0, 1]. Значение 0 для координаты z указывает заднюю панель отсечения, а значение 1 для координаты z указывает переднюю панель отсечения.

Z-буферный метод

Алгоритм

Шаг 1 — Установите значения буфера —

Depthbuffer (x, y) = 0

Framebuffer (x, y) = цвет фона

Шаг 2 — Обработка каждого полигона (по одному за раз)

Для каждой спроецированной (x, y) позиции полигона в пикселях вычислите глубину z.

Если Z> глубинный буфер (x, y)

Вычислить цвет поверхности,

установить глубинный буфер (x, y) = z,

кадровый буфер (x, y) = цвет поверхности (x, y)

преимущества

  • Это легко реализовать.
  • Это уменьшает проблему скорости, если реализовано аппаратно.
  • Обрабатывает один объект за раз.

Недостатки

  • Это требует большой памяти.
  • Это длительный процесс.

Scan-Line Метод

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

Таблица границ — содержит конечные точки координат каждой линии в сцене, обратный наклон каждой линии и указатели на таблицу полигонов для соединения краев с поверхностями.

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

Scan-Line Метод

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

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

Метод Район-Подразделение

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

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

  • Окружающая поверхность — та, которая полностью закрывает область.

  • Перекрывающаяся поверхность — та, которая частично находится внутри, а частично снаружи.

  • Внутренняя поверхность — та, которая полностью внутри области.

  • Наружная поверхность — та, которая полностью за пределами области.

Окружающая поверхность — та, которая полностью закрывает область.

Перекрывающаяся поверхность — та, которая частично находится внутри, а частично снаружи.

Внутренняя поверхность — та, которая полностью внутри области.

Наружная поверхность — та, которая полностью за пределами области.

Метод Район-Подразделение

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

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

Обнаружение заднего лица

Быстрый и простой объектно-пространственный метод для идентификации задних граней многогранника основан на тестах «внутри-снаружи». Точка (x, y, z) находится «внутри» поверхности многоугольника с параметрами плоскости A, B, C и D, если, когда внутренняя точка находится вдоль линии визирования к поверхности, многоугольник должен быть задней стороной ( мы находимся внутри этого лица и не можем видеть его спереди с нашей точки зрения).

Мы можем упростить этот тест, рассматривая вектор нормали N к поверхности многоугольника, которая имеет декартовы компоненты (A, B, C).

В общем, если V является вектором в направлении просмотра от положения глаза (или «камеры»), то этот многоугольник является задней стороной, если

VN> 0

Кроме того, если описания объектов преобразуются в координаты проекции, а направление просмотра параллельно оси Z просмотра, то —

V = (0, 0, V z ) и VN = V Z C

Так что нам нужно только рассмотреть знак C как компонент вектора нормали N.

В правосторонней системе просмотра с направлением просмотра вдоль отрицательной оси ZV полигон является задней стороной, если C <0. Кроме того, мы не можем видеть ни одну грань, у которой нормаль имеет z-компоненту C = 0, поскольку направление просмотра в направлении этого многоугольника. Таким образом, в общем случае мы можем пометить любой многоугольник как заднюю грань, если его вектор нормали имеет значение компонента z —

C <= 0

Обнаружение заднего лица

Подобные методы могут быть использованы в пакетах, которые используют левую систему просмотра. В этих пакетах параметры плоскости A, B, C и D могут быть вычислены из координат вершин многоугольника, указанных в направлении по часовой стрелке (в отличие от направления против часовой стрелки, используемого в правой системе).

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

Резервный Faces

A-буферный метод

Метод A-буфера является расширением метода глубины буфера. A-буферный метод — это метод обнаружения видимости, разработанный в киностудии Lucas для системы рендеринга Renders Everything You Ever Saw (REYES).

A-буфер расширяет метод буфера глубины, чтобы разрешить прозрачность. Ключевой структурой данных в A-буфере является буфер накопления.

A-буферный метод

Каждая позиция в A-буфере имеет два поля —

  • Поле глубины — хранит положительное или отрицательное вещественное число

  • Поле интенсивности — хранит информацию об интенсивности поверхности или значение указателя

Поле глубины — хранит положительное или отрицательное вещественное число

Поле интенсивности — хранит информацию об интенсивности поверхности или значение указателя

A-Buffer Fields

Если глубина> = 0, число, сохраненное в этой позиции, является глубиной одной поверхности, перекрывающей соответствующую область пикселей. Поле интенсивности затем сохраняет компоненты RGB цвета поверхности в этой точке и процент покрытия в пикселях.

Если глубина <0, это указывает вклад нескольких поверхностей в интенсивность пикселя. Поле интенсивности затем сохраняет указатель на связанный список данных поверхности. Поверхностный буфер в A-буфере включает в себя —

  • Компоненты интенсивности RGB
  • Параметр непрозрачности
  • глубина
  • Процент площади покрытия
  • Поверхностный идентификатор

Алгоритм работает так же, как алгоритм буфера глубины. Значения глубины и непрозрачности используются для определения окончательного цвета пикселя.

Метод сортировки по глубине

Метод сортировки по глубине использует как пространство изображения, так и операции с пространством объекта. Метод глубинной сортировки выполняет две основные функции:

  • Сначала поверхности сортируются в порядке убывания глубины.

  • Во-вторых, поверхности конвертируются по порядку, начиная с поверхности наибольшей глубины.

Сначала поверхности сортируются в порядке убывания глубины.

Во-вторых, поверхности конвертируются по порядку, начиная с поверхности наибольшей глубины.

Сканирование конверсии поверхностей многоугольника выполняется в пространстве изображения. Этот метод решения проблемы скрытой поверхности часто называют алгоритмом художника . На следующем рисунке показан эффект глубины сортировки —

Метод сортировки по глубине

Алгоритм начинается с сортировки по глубине. Например, начальная оценка «глубины» многоугольника может быть принята за ближайшее значение z любой вершины многоугольника.

Давайте возьмем многоугольник P в конце списка. Рассмотрим все многоугольники Q, чьи z-экстенты перекрывают P. Прежде чем рисовать P, мы проводим следующие тесты. Если какой-либо из следующих тестов является положительным, мы можем предположить, что P можно нарисовать до Q.

  • Х-экстенты не перекрываются?
  • Y-экстенты не перекрываются?
  • Является ли P полностью на противоположной стороне плоскости Q с точки зрения?
  • Находится ли Q полностью на той же стороне плоскости P, что и точка зрения?
  • Разве проекции многоугольников не перекрываются?

Если все тесты не пройдены, мы разделяем P или Q, используя плоскость другого. Новые вырезанные полигоны вставляются в порядок глубины, и процесс продолжается. Теоретически, это разбиение может генерировать O (n 2 ) отдельных многоугольников, но на практике число многоугольников намного меньше.

Деревья бинарных космических перегородок (BSP)

Разделение двоичного пространства используется для вычисления видимости. Чтобы построить деревья BSP, нужно начать с полигонов и обозначить все ребра. Работая только с одним ребром за раз, вытяните каждое ребро так, чтобы оно разделяло плоскость на два. Поместите первый край в дерево как корень. Добавьте последующие ребра в зависимости от того, находятся они внутри или снаружи. Ребра, которые охватывают расширение ребра, уже находящегося в дереве, разделяются на два, и оба добавляются в дерево.

Из приведенного выше рисунка сначала возьмите A в качестве корня.

Составьте список всех узлов на рисунке (а).

Поместите все узлы, которые находятся перед корнем A, с левой стороны от узла A, а все узлы, которые находятся за корнем A, с правой стороны, как показано на рисунке (b).

Сначала обработайте все передние узлы, а затем узлы сзади.

Как показано на рисунке (с), мы сначала обработаем узел B. Поскольку перед узлом B ничего нет, мы поставили NIL. Тем не менее, у нас есть узел C в задней части узла B , поэтому узел C перейдет к правой стороне узла B.

Повторите тот же процесс для узла D.