8.3. Удаление скрытых линий
При визуализации 3D сцен, особенно состоящих из многих объектов, неизбежно возникает задача удаления скрытых линий. В зависимости от выбранного направления взгляда объекты трехмерной сцены будут частично или полностью перекрывать друг друга (Рис. 10.6).

Рис. 8.12 – Одна и та же сцена до и после удаления скрытых линий.

Рис. 8.13 – Схема удаления скрытых линий.
На Рис. 10.7 показана поверхность сложной формы, которая проецируется на картинную плоскость. Точка 1 загораживает точку 2, потому что их проекции на картинную плоскость совпадают и при этом точка 1 находится ближе к наблюдателю (точке зрения), чем точка 2. Точка 3 же не загораживает точку 2, так она не находится между точкой 2 и наблюдателем.
Существует множество подходов к решению задачи удаления скрытых линий. Алгоритм удаления должен быть весьма эффективным, чтобы обеспечивать перерисовку изображения в реальном масштабе времени при перемещении точки зрения (оглядывании сцены).
Для векторных изображений наиболее простыми для понимания являются алгоритмы переборного типа. Для их использования необходимо иметь информацию о каждом ребре и грани каждого тела, включенного в сцену. Алгоритм в цикле перебирает все ребра и анализирует взаимное положение каждого ребра относительно каждой грани. При этом возможны три варианта взаимного расположения ребра и грани (Рис. 10.8).

Алгоритм относительно прост в реализации, однако требует большого количества вычислений. Время его работы пропорционально произведению числа граней на число ребер в сцене. Результат работы переборного алгоритма можно видеть на Рис. 10.6.
Для растровых изображений большое распространение получил метод Z-буфера. Название метода объясняется тем, что в нем используется специально выделенная область памяти для хранения относительной "глубины" (координаты Z) пикселов изображения. Еще одна область памяти, называемая "буфер кадра", хранит пикселы текущего создаваемого изображения.
В начальный момент в буфер глубины заносятся значения, соответствующие глубине фона (например, 255), а буфер кадра - пикселы, создающие фон (например, сканированное растровое изображение). Для каждого пиксела анализируется его "глубина", которая сравнивается с глубиной того пиксела, который имеет ту же проекцию на картинную плоскость и уже занесен в Z-буфер. Если значение "глубины" нового пиксела проекции меньше значения глубины соответствующего пиксела в z-буфере, то рассматриваемый элемент изображения находится ближе к картинной плоскости, чем часть уже построенной сцены. В этом случае новый пиксел заносится в буфер кадра и, кроме того, производится корректировка координаты z соответствующего элемента буфера глубины. Если же сравнение дает противоположный результат, то никаких действий не производится и, следовательно, буфер глубины и буфер кадра сохраняются без изменений. Таким образом, на каждом шаге мы имеем "правильное изображение" той части сцены, которая уже подверглась анализу.
Данный алгоритм применим и к векторным изображениям. В этом случае последовательность шагов такова:
1. Заполнить буфер кадра фоновым изображением.
2. Заполнить буфер глубины значениями глубины фона.
3. Для каждой грани сцены последовательно:
- преобразовать проекцию грани в растровую форму (например, при помощи алгоритма Брэзенхема);
- для каждого пиксела проекции вычислить его глубину z=z(x,y);
- сравнить значение z(x,y) с соответствующим значением буфера глубины Z(x,y);
- Если z(x,y)< Z(x,y), то:
- записать этот пиксел в буфер кадра;
- записать значение z(x,y) в соответствующую позицию буфера глубины Z(x,y).
Метод Z-буфера хорошо пригоден для накладывания изображения трехмерной сцены на заранее подготовленный фон. Результат работы метода Z-буфера показан на Рис. 10.9.

Рис. 8.15 – Результат визуализации методом Z-буфера (SolidWorks 2003).
8.4. Способы создания фотореалистических изображений
Рассмотренные ранее алгоритмы позволяют строить проекции граней и ребер объектов и удалять скрытые линии. Но каким образом на изображении (Рис. 10.9) получаются плавные переходы цвета, тени, материалы тел, как учитываются источники освещения? Комплекс задач, связанных с визуализацией материалов при заданных условиях освещения, получил название рендеринга (англ. rendering). Более узко в КГ под рендерингом понимают получение фотореалистичного изображения объекта.
Для выполнения рендеринга, помимо собственно 3D сцены, необходимо задать условия освещения и оптические свойства всех задействованных в сцене материалов. Рассмотрим сначала свойства источников света. Мы видим тела либо в отраженном свете (Луна отражает свет Солнца), либо благодаря собственному свечению нагретого тела (Солнце светится само). Глаз человека привык к естественному источнику – Солнцу, температура поверхности которого примерно 6000оС. При этом Солнце имеет избыток лучей в желто-красной зоне спектра. Искусственные источники света обычно несколько искажают цветовосприятие. Например, лампы накаливания дают значительный избыток желтых лучей. Лампы дневного света более сбалансированы по спектральному составу, из-за чего их свет по сравнению с солнечным кажется холодным.
Световой луч, независимо от его источника, падая на поверхность, частично поглощается, частично отражается и частично пропускается. Если часть света проходит сквозь материал, он называется прозрачным. Для визуализации наиболее важен отраженный свет. Он делится на две составляющие: диффузно отраженный и зеркально отраженный. При диффузном отражении лучи отходят от поверхности хаотично во всех направлениях, а поверхность называется матовой. При зеркальном отражении лучи идут строго в заданном направлении в соответствии с законом "угол падения равен углу отражения" (Рис. 11.1).

Свет, падающий на поверхность, может быть рассеянным (англ. ambient light) и направленным (англ. spotlight). Интенсивность рассеянного света одинакова во всех направлениях. Направленным является свет удаленного точечного источника. Например, свет Солнца на Луне при отсутствии атмосферы является направленным, на Земле же он рассеивается атмосферой во всех направлениях и в условиях облачности становится рассеянным.
Таким образом, наблюдатель сцены видит четыре вида света:
- рассеянный, освещающий всю сцену;
- диффузно отраженный то матовых поверхностей;
- зеркально отраженный от зеркальных поверхностей;
- пропущенный через прозрачные материалы.
От каждой точки поверхности в точку наблюдения приходит рассеянный свет одинаковой интенсивности. Интенсивность рассеянного света I в точке наблюдения равна:
|
|
(10) |
где
- интенсивность источника рассеянного света;
- коэффициент отражения материала (0 для абсолютно черного тела и 1 для идеального зеркала).
Интенсивность диффузно отраженного света
от точечного источника определяется по закону Ламберта:
|
|
(11) |
где
- интенсивность точечного источника направленного света;
- коэффициент диффузного отражения материала (1 для матовой поверхности и 0 для идеального зеркала);
- угол между направлением на точечный источник света и нормалью к поверхности.
Зеркальные поверхности отражают разные количества света в разных направлениях, что вызывает образование бликов. Интенсивность зеркально отраженного света
можно определить по закону Фонга:
|
|
(12) |
где
- коэффициент зеркального отражения материала (0 для матовой поверхности и 1 для идеального зеркала);
- угол между направлением отраженного света и направлением к точке наблюдения;
n – коэффициент блеска. Чем выше n, тем больше блик на материале.
Интенсивность пропущенного света
определяется по закону Бугера:
|
|
(13) |
где
- интенсивность света на входе в прозрачный материал;
l – толщина материала;
m - коэффициент поглощения света данным материалом.
Непосредственно при рендеринге по формулам (10)-(13) для каждой точки поверхности рассчитываются интенсивности четырех видов света. При этом учитываются координаты и характеристики источников освещения. Для создания реалистичного изображения, как правило, нужно применить не менее трех источников света: один дает общую подсветку рассеянным освещением, а два других источника – направленные, обеспечивают светотень.
Рендеринг подразумевает плавную закраску отображаемых поверхностей, которые представлены в виде триангуляционной сетки (Рис. 11.2).

Рис. 8.17 – Представление поверхности в виде триангуляционной сетки.
Такая закраска выполняется одним из следующих основных способов: однотонно, путем интерполяции значений интенсивности и путем интерполяции нормалей.
При однотонной закраске (Рис. 11.3, а) для каждого треугольника рассчитывается величина отраженного от него света, которая считается постоянной для всего треугольника. Также считается, что угол отражения световых лучей постоянен в пределах треугольника. В результате получается "граненое" изображение, поскольку яркость отраженного света у каждого треугольника меняется скачком, резко.
Метод интерполяции значений интенсивности (Рис. 11.3, б) предложен Гуро и часто называется "рендеринг по Гуро" (Gouraud rendering). При этом методе рассчитываются интенсивности отраженного света в углах каждого треугольника, а интенсивности для внутренних точек треугольника находятся методом интерполяции (усреднения значений). Метод Гуро делает визуализацию более гладкой, хотя "граненость" полностью не устраняется.
Метод интерполяции нормалей (Рис. 11.3, в) или метод Фонга (Phong rendering) заключается на интерполяции нормалей к поверхности в пределах треугольника. Нормали в вершинах находятся точно, а нормали во всех остальных точках вычисляются методом интерполяции. При этом нормали плавно меняют направление при переходе от одного треугольника к другому, что позволяет полностью устранить "граненость", но за счет значительного объема вычислений.

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