1. ОСНОВНЫЕ ЗАДАЧИ КОМПЬЮТЕРНОЙ ГРАФИКИ. ФОРМИРОВАНИЕ ИЗОБРАЖЕНИЯ При обработке на компьютере информации, связанной с изображением, принято выделять несколько основных направлений: распознавание образов (COMPUTER VISION), основной задачей которого является получение описаний изображенных объектов, обработка изображений (IMAGE PROCESSING) и компьютерная графика (COMPUTER GRAPHICS). Ранее эти направления представляли собой совершенно независимые дисциплины. Сейчас области их пересечения становятся все шире, а их границы – все более условными [9, 14, 16, 17]. Задачей компьютерной (машинной) графики является визуализация, (т.е. создание изображения), проводимая на основе информации неизобразительного характера. Под термином «изображение» здесь понимается множество точек, линий и т.п., выводимых на графическое устройство (монитор, принтер и др.). Необходимые для визуализации исходные данные, содержащие описание изображения, хранятся на компьютере в виде графических файлов. Внедрением и извлечением информации из графических файлов управляет прикладная графическая программа. Прикладная программа передает данные и сформированные графические команды в графическую систему (рис. 1.1) [14]. Графические файлы Прикладная графическая программа Графическая система Устройства вывода Устройства ввода Рис. 1.1. Схема взаимодействия прикладной программы и графической системы. Графическая система снабжена пакетом подпрограмм вывода, управляющих конкретным устройством вывода (монитором, принтером и пр.) и обеспечивающих визуализацию изображения этим устройством. Большинство современных графических программ обеспечивают интерактивность компьютерной графики, т.е. дают пользователю возможность динамически управлять содержанием создаваемого на мониторе изображения с помощью устройств ввода (клавиатуры, мыши, джойстика, и др.). Ввод информации пользователем осуществляется с помощью подпрограмм ввода графической системы, которая передает вводимые данные в прикладную графическую программу. 1.1. Виды графических систем На графических устройствах вывода изображение может создаваться двумя путями: путем произвольного сканирования или путем растрового сканирования [10, 14]. В системах с произвольным (векторным) сканированием изображение появляется на экране (или бумаге) в произвольном порядке путем рисования прямых или кривых линий (векторов). Изображение рассматривается как совокупность простых графических объектов (примитивов) – прямых, дуг, окружностей, прямоугольников и т.д. Векторная визуализация используется в векторных дисплеях и таких печатающих устройствах, как перьевые графопостроители (плоттеры). Типичная последовательность действий при векторной визуализации выглядит так: перевести перо в начальную точку (для дисплея – отклонить пучок электронов) – опустить перо (увеличить яркость луча) – переместить перо в конечную точку – поднять перо (уменьшить яркость луча). Качество визуализации для векторных устройств зависит от точности вывода и номенклатуры базовых графических примитивов. Недостатком векторного сканирования являются проблемы, возникающие при необходимости сплошного заполнения фигур. В графических системах с растровым сканированием изображение представляется в виде совокупности отдельных точек – пикселей. Матрица пикселей образует растр. В зависимости от расположения пикселей в пространстве различают прямоугольный, квадратный, гексагональный и иные типы растра. Основными характеристиками растра являются: разрешающая способность – характеризует расстояние между соседними пикселями, измеряется в количестве пикселей на единицу длины (dpi – dots per inch – количество пикселей на дюйм); размер растра – количество пикселей по горизонтали и вертикали; форма пикселей – прямоугольные, квадратные, круглые; количество цветов (глубина) – количество бит, используемых для хранения информации о цвете одного пикселя. К устройствам с растровым сканированием относятся мониторы, телевизоры, принтеры. Схема организации растрового сканирования зависит от конкретного устройства вывода. В общем случае, сначала появляются все части рисунка, находящиеся в первой строке (слева – направо), затем – все части рисунка, находящиеся во второй строке, и т.д. В мониторах применяются построчная и чересстрочная развертки (рис. 1.2). Рис. 1.2. Схемы построчной (а) и чересстрочной (б) разверток. При построчной развертке сканирование начинается с левого верхнего угла экрана. Во время перемещения луча слева направо его интенсивность модулируется для создания различных уровней тона. При достижении правого края растра луч выключается и переносится левому краю, смещаясь при этом на одну единицу растра вниз. После того, как будут отработаны все строки растра, луч переводится в верхний левый угол. Прямой ход луча по горизонтали осуществляется сигналом строчной (горизонтальной) развертки, а по вертикали – кадровой (вертикальной). Чересстрочная развертка чаще применяется в телевизорах. Сначала воспроизводятся только нечетные строки растра (нечетный полукадр), потом – четные (четный полукадр). Большинство растровых графических устройств используют от 256 до 1024 строки, телевизионное вещание в США – 525 строк. Недостатком растровых устройств вывода является дискретность изображения, состоящего из отдельных точек. В настоящее время доминирует растровый способ визуализации. Это связано с большой распространенностью растровых мониторов и печатающих устройств (принтеров). 1.2. Форматы графических файлов Формат графического файла – способ представления и расположения графических данных на внешнем носителе. Как и в случае с аппаратной визуализацией, различают векторные и растровые форматы. Файлы векторного формата содержат описание изображения в виде набора команд, необходимых для построения простейших графических объектов (векторных примитивов), составляющих изображение. Информация о цвете объекта, толщине линий и т.п. хранится как часть его описания. Хранимые в векторном формате описания изображений занимают относительно небольшой объем памяти. Недостаток векторного формата – не позволяет получать описания изображений фотографического качества. Для создания и редактирования векторных изображений используются специальные векторные прикладные графические программы (графические редакторы). К ним относятся CorelDRAW!, AutoCAD и др. Так как основным понятием векторной графики является объект (векторный примитив), то векторные графические редакторы позволяют пользователю проводить над объектами различные операции – создания, удаления, упорядочивания, пересечения и т.п. Одновременно с процессом рисования графический редактор формирует векторные команды, соответствующие объектам, из которых строится изображение. Примером векторного формата графических файлов является формат AutoCAD DXF (Drawing Interchange Format – формат обмена чертежами), используемый прикладными программами AutoCAD, CorelDRAW! и многими программами САПР. В файлах растровых форматов содержатся данные о размере и разрешении растра, битовой глубине, а также информация о цвете каждого пикселя изображения. Для кодирования 16 цветов используется 4 бита на один пиксель изображения, для кодирования 256 цветов – 8 бит. С помощью 24 бит кодируют 224 цветов (True Color). Отсюда вытекает основной недостаток растрового формата – для хранения описания изображения высокого качества (с большим разрешением и битовой глубиной) требуется большой памяти. В тоже время, растровый формат, в отличие от векторного, позволяет получать описания изображений фотографического качества. Решением проблемы большого объема растровых является сжатие, т.е. уменьшение размера файла за счет изменения способа организации данных. Существуют следующие методы сжатия [5, 8]. 1) С помощью программ-архиваторов (ZIP, ARJ, RAR). Сжатие проводится также как и для неграфических файлов. Сжатый таким образом файл не может использоваться ни одной программой до того как будет разархивирован. 2) С помощью алгоритма, включенного в формат файла (методы RLE, LZW, JPEG, фрактальный и др.). Метод сжатия RLE (Run-Length Encoding) – проводится замена последовательности повторяющихся пикселей парой величин: цветом пикселя и количеством его повторений. Наиболее эффективен для изображений, содержащих большие области однотонной закраски. Используется в форматах BMP, TIFF, PCX. Метод сжатия LZW (назван по фамилиям разработчиков Lempel, Ziv, Welch) основан на поиске повторяющихся узоров в изображении. Эффективен для изображений, насыщенных узорами. Используется в форматах GIF, TIFF. Метод сжатия JPEG (Joint Photographic Experts Group) сильно уменьшает размер файла за счет потерь в качестве. Основан на том, что человеческий глаз более чувствителен к изменению яркости, чем к изменению цвета. При сжатии файла запоминается больше информации о разнице в яркости соседних пикселей и меньше – о разнице между их цветами. Используется для изображений фотографического качества. Степень сжатия файла и, следовательно, степень потери информации может контролироваться пользователем. Используется в форматах JPEG, TIFF и др. Фрактальное сжатие – переводит изображение в совокупность математических данных, описывающих фрактальные, т.е. похожие, повторяющиеся, свойства изображения [10, 15]. С растровыми файлами работают графические редакторы Paint, Adobe PhotoShop и др. Так как основное понятие растровой графики – пиксель, то большинство инструментов и команд этих редакторов позволяют пользователю изменять яркость и цветовые оттенки отдельных пикселей, а также служат для выделения отдельных областей (наборов пикселей). Геометрические преобразования растровых рисунков зачастую приводят к потере качества изображения. Графические редакторы производят изменение размеров растрового изображения одним из двух способов [5]: одинаково изменяя размер всех пикселей рисунка – при увеличении рисунка растет число видеопикселей, необходимых для визуализации одного пикселя рисунка, и, следовательно, становится более заметной «ступенчатость» изображения; проводя выборку пикселей из изображения путем удаления или введения новых пикселей, при этом цвет создаваемых пикселей определяется цветом исходного пикселя и его окружения; возможно исчезновение из рисунка отдельных деталей, уменьшение резкости, появление «муара». Наиболее удобно, когда способ описания графического изображения (т.е. формат графического файла) соответствует способу аппаратной визуализации. В противном случае необходима конвертация. Векторизация (трассировка) – преобразование описания изображения из растрового в векторный формат. Обратное преобразование носит название растеризации (растрирования). Растрирование выполняется, например, когда хранимое в векторном формате изображение необходимо визуализировать на растровом устройстве (мониторе). Помимо растрового и векторного форматов графических файлов существует еще метафайловый формат [8]. Метафайлы могут хранить и растровые и векторные данные. Простейшие метафайлы похожи на файлы векторного формата, но могут включать и растровое представление изображения. Метафайлы часто используются для транспортировки растровых и векторных данных между аппаратными платформами. Примерами метафайловых форматов являются WMF (Microsoft Windows Metafile), WPG (WordPerfect Graphics Metafile), CGM (Computer Graphics Metafile). На метафайлы распространяются все преимущества и недостатки растрового и векторного форматов, своеобразным «гибридом» которых они являются. Однако размер метафайла в некоторых случаях может оказаться меньше, чем размер растровой версии того же изображения. Файлы трехмерной графики хранят описание формы и цвета объемных моделей воображаемых или реальных объектов [8]. Объемные модели обычно конструируются из многоугольников и гладких поверхностей, объединенных описаниями соответствующих элементов (цвета, текстуры, отражающих свойств поверхности), с помощью которых программа визуализации реконструирует объект. Модели помещаются в сцены с источниками света и камерами, поэтому такие файлы часто называют файлами описания сцены. Трехмерные данные сейчас поддерживаются и рядом форматов, которые раньше служили только для хранения векторных данных (DFX и др.). Такие форматы иногда называют расширенными векторными форматами. Существует и трехмерный растр, состоящий из объемных элементов – вокселей [10]. Воксел (voxel – volume element) является аналогом пикселя в двумерном растре. Каждый воксел имеет свой цвет, а , кроме того, прозрачность. Полная прозрачность воксела означает пустоту соответствующей точки объема. Трехмерный растр используется в компьютерных системах для медицины (например, для хранения данных томмографии), геологии и т.п. Достоинства и недостатки такие же, как и у двумерного растра. Для визуализации трехмерного растра на экране монитора используют срезы. Форматы анимации появились сравнительно недавно. Иллюзия движения объектов на экране монитора создается за счет быстрой смены изображений, в каждом из которых незначительно изменяются позиции объектов анимации (FLI, DVM Movie и др.). Анимационные форматы хранят тем или иным способом только неподвижные изображения (видеоинформация не поддерживается): хранят все изображения целиком, отображая их одно за другим; хранят одно изображение и несколько цветовых таблиц для него; после загрузки новой цветовой таблицы цвет изображения меняется и создается иллюзия движения объекта; хранят только различия между каждой парой последовательно отображаемых изображений (называемых фреймами); изменяют только те пиксели, которые меняются при отображении данного фрейма. В настоящее время все большее значение приобретают мультимедиа-форматы, предназначенные для хранения данных различных типов в одном файле (форматы QuickTime, MPEG, Intel DVI, Microsoft RIFF и др.). Позволяют объединять графическую, звуковую и видеоинформацию. 1.3. Графические библиотеки Интерфейс прикладного программирования API (Application Programming Interface) – это интерфейс между прикладной программой и графической системой, содержащий библиотеки функций, которые прикладная программа использует для связи с аппаратными средствами [10, 17, 20]. Функции для работы с графикой образуют графические библиотеки. Применение API обеспечивает аппаратную независимость прикладных программ. Прикладной программист, работающий с API, избавлен от необходимости детально вникать в программную реализацию функций графической библиотеки и в подробности работы аппаратуры. API делятся на стандартные (универсальные), поддерживающие широкий спектр устройств, и специализированные (для конкретного устройства или семейства устройств). Графические функции из состава API Windows объединены в отдельную группу – подсистему GDI (Graphics Device Interface). Наиболее часто при работе с трехмерной графикой в Windows используются следующие API – OpenGL и Direct3D. Достоинством OpenGL является его широкая распространенность. Стандарт OpenGL разработан в 1992 г. В операционной системе Windows OpenGL поддерживается начиная с версии OSR 2. OpenGL – это аппаратно-независимый интерфейс, поэтому он не включает в себя специальных команд по работе с окнами или ввода информации от пользователя. Эти функции отданы операционной системе. Для работы OpenGL в Windows используется понятие контекста отображения (rendering context), который связывает OpenGL с оконной системой Windows. Контекст отображения указывает плоскость отображения, на которую делается графический вывод (окно программы на экране, страница принтера и т.п.). Чтобы начать работать с OpenGL, нужно создать хотя бы один контекст и сделать его текущим. Вызов необходимого драйвера устройства будет выполнять сама операционная система. В состав OpenGL, как и других трехмерных графических API, входят функции, позволяющие описывать объекты, свойства материалов объектов, камеры, источники света [10, 12, 13, 20]. Существенный недостаток OpenGL – отсутствие встроенных объектно-ориентированных средств для описания сложных сцен. Существует надстройка для OpenGL – библиотека классов Open Inventor, которая является объектно-ориентированной API. Open Inventor позволяет пользователю сохранять описание сцены в виде текстового файла. Формат базы данных Open Inventor послужил основой для языка моделирования виртуальной реальности VRML (Virtual Reality Modeling Language). Быстродействие прикладных графических программ, использующих OpenGL, достигается при аппаратной реализации базовых функций OpenGL. В настоящее время многие видеоадаптеры содержат специальный графический процессор (или несколько) для поддержки функций графики (преобразований координат, расчетов освещения, наложения текстур, отсечения и др.). Для повышения быстродействия применяется конвейерная архитектура ГС. 2. СИСТЕМЫ ЦВЕТОВ В КОМПЬЮТЕРНОЙ ГРАФИКЕ Свет – это электромагнитное излучение. Лучи света, попадая на сетчатку глаза, производят ощущение цвета. Свет может попадать к глазу непосредственно от источника излучения (излучаемый свет), сохраняя все цвета, из которых он был создан. При отражении от какого-либо предмета часть световых волн может быть поглощена его поверхностью, а часть - отразиться (отраженный свет). Для описания цветовых оттенков, которые могут быть воспроизведены на экране компьютера или при печати, разработаны специальные цветовые модели (системы цветов). Так как цвет может получиться и в процессе излучения, и в процессе отражения, существуют два противоположных метода его описания – системы аддитивных и субтрактивных цветов [5, 14, 17, 20]. 2.1. Система аддитивных цветов Эта система цветов используется для излучаемого цвета (для мониторов, светящихся материалов). Аддитивный (add – присоединять) цвет в модели RGB получается при сложении лучей трех основных (базовых) цветов – красного (Red), зеленого (Green) и синего (Blue) разной интенсивности. Если интенсивность каждого из основных цветов достигает 100%, то получается белый цвет. Отсутствие всех трех цветов дает черный цвет. Схема смешивания базовых цветов для модели RGB представлена на рис. 2.1. желтый голубой G R B белый пурпурный Рис. 2.1. Схема смешивания базовых цветов в модели RGB. Цветовая модель RGB используется в мониторах и жидкокристаллических дисплеях. Для некоторых цветов коэффициенты в модели RGB должны иметь отрицательные веса. То есть система RGB имеет неполный цветовой охват: некоторые насыщенные цвета (все насыщенные спектральные цвета, кроме базовых цветов самой модели) не могут быть представлены смесью трех компонент. Для решения проблемы отрицательных коэффициентов в модели RGB в 1931 г. Международная комиссия по освещению приняла систему XYZ. В этой системе в качестве базовых были приняты три цвета X, Y и Z, которые носят условный характер (не соответствуют никаким реальным цветам), величина Y совпадает с чувствительностью глаза к свету. Цветовой график для модели XYZ в хроматических координатах x = X / (X + Y + Z) и y = Y / (X + Y + Z) представлен на рис. 2.2. у зеленый Д синий Д- опорный белый цвет в мониторе. (х и y дают относительное количество трех основных цветов XYZ и еще задают яркость Y). Модель RGB красный х Рис. 2.2. Цветовой график в хроматических координатах На цветовом графике все видимые цвета попадают внутрь замкнутой области, ограниченной с одной стороны кривой линией (соответствующей насыщенным спектральным цветам), а с другой стороны – прямой, соответствующей неспектральным сиреневым цветам. 2.2. Система субтрактивных цветов Для печати графических изображений используется субтрактивная (subtract – вычитать) система цветов, работающая с отраженным светом. Белая бумага при освещении отражает все цвета, окрашенная же бумага поглощает часть цветов, а остальные – отражает. В системе субтрактивных цветов CMY основными являются голубой или, скорее, бирюзовый (Cyan), пурпурный (Magenta) и желтый (Yellow). Каждый из них вычитает (т.е. поглощает) определенные цвета из белого света, падающего на печатную страницу: голубой краситель вычитает красный цвет, оставляя зеленую и синюю компоненту, малиновый краситель поглощает зеленый, а желтый краситель – синий цвет. Голубой, желтый и малиновый красители поглощают красный, зеленый и синий цвета, оставляя в результате черный (см. рис. 2.3). Белый цвет получается при отсутствии всех трех основных цветов. пропускает красный и синий (пурпурный) белый цвет пурпурный фильтр желтый фильтр поглощает зеленый Рис. 2.3. Взаимосвязь цветов в моделях RGB и CMY. поглощает синий пропускает красный черный цвет голубой фильтр поглощает красный Значения цветов в системе CMY – это просто инвертированные значения системы RGB. Преобразование из модели RGB в модель CMY выполняется следующим образом: R 1 C G = 1 - M B 1 Y Однако при печати использование трех красителей для получения черного цвета оказывается дорогостоящим и неудобным, поэтому используется модель CMYK (Cyan, Magenta, Yellow, blacK) – т.е. дополнительно используется черная краска. Из-за различия природы получения цветов в моделях RGB и CMYK достаточно трудно точно воспроизвести при печати цвет, который мы видим на мониторе. Обычно на экране цвет выглядит несколько ярче. 2.3. Система «Тон – Насыщенность – Яркость» Более интуитивным способом описания цвета является система HSB – тон (Hue), насыщенность (Saturation), яркость (Brightness). Тон – это конкретный оттенок цвета: красный, желтый, зеленый, пурпурный и т.п. Насыщенность характеризует чистоту, т.е. степень ослабления данного цвета белым цветом. Уменьшая насыщенность, мы «разбавляем» его белым цветом. Яркость зависит от количества черной краски, добавленной к данному цвету – чем меньше черного, тем больше яркость. Для отображения на мониторе компьютера система HSB преобразуется в систему RGB, а для печати – в систему CMYK. 3. БАЗОВЫЕ РАСТРОВЫЕ АЛГОРИТМЫ Базовые растровые алгоритмы переводят простейшие векторные примитивы (отрезки, окружности и т.п.) в их растровые образы (при растрировании векторных изображений) или служат для обработки растровых изображений [10, 14, 17]. В общем случае, растровое представление векторного примитива не является единственным и возможны различные способы его построения. Важным понятием для растровой сетки является связность, определяющая когда два пикселя можно считать соседними. Вводится два понятия связности (рис. 3.1) [17]: четырехсвязность – пиксели считаются соседними, если либо их х-координаты, либо их у-координаты отличаются на единицу; т.е. у каждого пикселя может быть четыре соседа; восьмисвязность - пиксели считаются соседними, если их х-координаты и у-координаты отличаются не более, чем на единицу; т.е. у каждого пикселя может быть восемь соседей. Рис. 3.1. Соседние пиксели: а – четырехсвязные, б – восьмисвязные. Любые два 4-связных пикселя являются и 8-связными, но не наоборот. 3.1. Растровое представление отрезка В качестве отрезка на растровой сетке выступает набор пикселей Р1, Р2, …, Рn, где любые два пикселя Рi и Рi+1 являются соседними в смысле заданной связности. Таким образом, возникает понятие 4- и 8-связных отрезков. Пусть заданы координаты (х1, у1) и (х2, у2) начального и конечного пикселей отрезка. Для вывода отрезка необходимо знать координаты каждого из составляющих его пикселей. Наиболее просто нарисовать отрезок горизонтальной или вертикальной линии. Например, для горизонтальной линии при х1 < x2 и у1= у2 выполняется цикл по х: for (x=x1; x<=x2; x=x+1) putpixel (x, y1, COLOR); Вычисление координат пикселей, составляющих наклонную линию, происходит более сложно. Известно несколько методов таких вычислений, рассмотрим некоторые из них. Простейший пошаговый алгоритм выполняется следующим образом – на каждом шаге координаты х, у пикселей отрезка вычисляются исходя из их значений на предыдущем шаге: хi+1 = xi + x, yi+1 = yi + y, где x и у – приращения координат. у / х = (у2 - у1 )/( x2 - x1)= tg, где tg – тангенс угла наклона отрезка к оси х. Принимая х = 1, получим: у = tg, хi+1 = xi + 1, уi+1 = уi + tg. При значении tg >1 при вычислениях координат пикселей х и у меняют местами, принимая у= 1, а х = 1 / tg. Так как тангенс угла наклона отрезка в общем случае не является целой величиной, в данном алгоритме используется процедура округления значений второй координаты до целого, что замедляет вычисления. Из-за погрешности представления в компьютере дробных чисел с каждым шагом может накапливаться ошибка вычисления второй координаты и возможен случай, когда вычисленная на последнем шаге координата у не совпадет с координатой конца отрезка у2. Алгоритм Брезенхэма – это инкрементный алгоритм, использующий только целочисленные операции сложения, вычитания и сравнения, не использующий умножение и деление. Вещественные переменные в алгоритме не используются совсем и, следовательно, операции округления не требуется. Алгоритм выполняется как пошаговое вычисление координат соседних пикселей. На каждом шаге на основе анализа функции погрешности е координаты х и у предыдущего пикселя либо изменяются на единицу, либо остаются прежними. Значение функции погрешности, вычисляемой на i–ом шаге, зависит от значения погрешности на i+1–ом шаге и от того, выполнялось ли на этом шаге изменение координат пикселя. Восьмисвязный алгоритм Брезенхэма [10]: //Длина отрезка по оси х. lx=x2–x1; ly=y2–y1; //Длина отрезка по оси у. ex=0; //Функции ey=0; // погрешности. if (lx>0) dx=1; //Выбор значений приращений //координаты х за один else if (lx==0) dx=0; //шаг. else dx=-1; //Тоже, для координаты у. if (ly>0) dy=1; else if (ly==0) dy=0; else dy=-1; lx=abs(lx); ly=abs(ly); //Абсолютные длины отрезка по осям х и у. if (lx>ly) l=lx; else l=ly; //Количество шагов алгоритма l. x=x1; y=y1; putpixel (x, y, COLOR); //Рисуется начальный пиксель for (i=1; i<=l; i=i+1) { ex=ex+lx; ey=ey+ly; if (ex>=l) { ex=ex-l; x=x+dx; } if (ey>=l) { ey=ey-l; y=y+dx;} putpixel (x, y, COLOR); } Четырехсвязные алгоритмы выполняются за большее число циклов, т.к. на каждом шаге может изменяться либо координата х, либо координата у, но не обе сразу. Существуют алгоритмы Брезенхэма, служащие для построения других векторных примитивов: окружности, эллипса и др [10, 17, 19]. 3.2. Устранение ступенчатого эффекта Для устранения ступенчатого эффекта в растровых изображениях используют методы выравнивания и сглаживания. Основная идея этого метода состоит в том, что видимые линии и отрезки имеют ненулевую толщину. И для их отображения на экране или бумаге используются пиксели, которые также имеют ненулевую площадь. Чтобы растровое изображение выглядело более гладким, цвет угловых пикселей «ступенек» заменяется на некоторый оттенок, промежуточный между цветом объекта и цветом фона: Cx = (CSx + Cф(S – Sx)) / S, где Cx – искомый оттенок цвета углового пикселя; S – площадь пикселя; Sx – часть площади пикселя, перекрываемая идеальным контуром векторного объекта; Cф – цвет фона; C – цвет объекта. Таким образом, устранение ступенчатого эффекта достигается за счет размывания контура объекта (рис. 3.2). Рис. 3.2. Устранение ступенчатого эффекта. 3.3. Заполнение области (закрашивание) Область представляет собой группу примыкающих друг к другу связанных пикселей. Области пикселей могут задаваться различными способами [17]. Внутренне-определенные области задаются своими внутренними значениями: все пиксели в области имеют одно значение цвета и ни один из пикселей, принадлежащих границе области, не принимает этого значения. Гранично-определенные области – все пиксели, принадлежащие границе, имеют одинаковое значение цвета и ни один из пикселей области не принимает этого значения. Заполнение области – это присваивание всем пикселям, лежащим внутри области, некоторого общего значения цвета. Рассмотрим простейший алгоритм закрашивания гранично-определенной области. На первом этапе находится пиксель, лежащий внутри области. Ему присваивается значение цвета заполнения. Затем проводится анализ цветов всех соседних пикселей. Если цвет соседнего пикселя не равен цвету границе или цвету заполнения, то цвет этого пикселя изменяется на цвет заполнения. Потом анализируется цвет пикселей, соседних с уже рассмотренными, и для них повторяется процедура закраски. Восьмисвязные алгоритмы закраски могут давать выход за пределы области (рис. 3.3). 4-связная граница 8-связная граница Рис. 3.3. Выход за границу области при 8-связном алгоритме закрашивания. Как видно из рисунка, для правильного выполнения алгоритма закрашивания граница 8-связной области должна быть 4-связна. Большую скорость закрашивания обеспечивают алгоритмы, которые обрабатывают не отдельные пиксели, а сразу блоки пикселей (отрезки, прямоугольники). Закрашивание области линиями заключается в том, что на каждом шаге закрашивания рисуется горизонтальный отрезок максимальной длины, который размещается между пикселями границы. Затем проверяются пиксели, лежащие непосредственно над и под отрезком. Если находятся незаполненные пиксели, то отрисовывается новый отрезок. 3.4. Алгоритмы закрашивания, использующие математическое описание контура Данные алгоритмы закрашивания не требуют обязательного предварительного создания пикселей границы области. Математическим описанием контура фигуры может служить уравнение кривой (окружности, эллипса). Для многоугольников контур задается множеством координат вершин (хi, уi) и соединяющих их отрезков. Наиболее просто заполнить прямоугольник со сторонами, параллельными осям координат, заданный координатами диагональных углов (х1, у1) и (х2, у2), причем x1<x2, y1<y2: for (y=y1; y<=y2; y=y+1) // Рисуется горизонтальная линия { line (x1, y, x2, y); // от точки с координатами (x1, y) } // до точки (x2, y). Рассмотрим более подробно алгоритм заполнения многоугольника произвольной формы [10]. Пусть задан многоугольник с вершинами Р0, Р1, …, Рn (рис. 3.4). Наиболее популярный алгоритм закрашивает многоугольник отрезками прямых горизонтальных линий. Для каждой из горизонталей у = уi. находятся ординаты точек пересечения со всеми отрезками контура многоугольника. Затем проводится сортировка по возрастанию значений массива хj. Многоугольник закрашивается путем рисования отрезков (х0, уi; х1, уi), (х2, уi; х3, уi), (х4, уi; х5, уi) и так далее. Для правильного заполнения многоугольника рассмотренным способом количество точек пересечения отрезков контура с каждой из горизонталей у = уi должно всегда быть четным. Если горизонталь проходит через вершину многоугольника, то должен проводиться дополнительный анализ: если горизонталь при прохождении через вершину пересекает контур многоугольника (на рис. 3.4 это вершины Р0 и Р4), то в массив хj записывается только одна координата точки пересечения; если горизонталь касается вершины (вершины Р1, Р2, Р3 и Рn), не пересекая в этой точке контур, то координаты точки касания в массив хj или не записываются, или записываются дважды. 4. АЛГОРИТМЫ ОТСЕЧЕНИЯ Очень часто координаты некоторых точек рисуемых объектов, хранимые в прикладной базе данных, могут выходить за границы видимости (окна устройства вывода). То есть, объекты сначала должны пройти процесс отсечения и перевода координат составляющих их точек в координаты устройства вывода, лишь затем они могут быть визуализированы. Область отсечения, как правило, представляет из себя прямоугольник. В простейшем случае – при отсечении двумерного отрезка относительно прямоугольного окна необходимо произвести вычисление координат точек пересечения отрезка с границами окна. Для сокращения объема вычислений и уменьшения числа операций умножения и деления используются различные алгоритмы, одним их которых является алгоритм Коэна-Сазерленда [20]. В этом алгоритме картинная плоскость разбивается на девять областей прямыми, проходящими через стороны отсекающего прямоугольника. Каждой из областей присваивается 4-битовый код, где установленный нулевой бит означает, что область лежит выше прямоугольника, первый бит – что область лежит ниже прямоугольника, второй бит – что область лежит правее прямоугольника, а третий бит – что область лежит левее прямоугольника (рис. 4.1). 1001 1000 1010 0001 0000 0010 0101 0100 0110 Рис. 4.1. Коды областей картинной плоскости. Путем анализа кодов областей, в которые попадают начальная и конечная точки каждого отрезка, выявляются отрезки, для которых необходимо проводить отсечение, и отбрасываются отрезки, которые лежат за границами отсекающей области. Вычисление точек пересечения выполняется только там, где это действительно необходимо. Для анализа кодов достаточно только булевых побитовых операций над двоичными числами. Рассмотрим алгоритм Сазерленда и Ходгмана, используемый для отсечения многоугольников относительно видимого окна [14]. Этот алгоритм позволяет свести задачу отсечения относительно прямоугольной области (рис. 4.2-а) к серии более простых задач отсечения многоугольника вдоль прямой, проходящей через одну из границ окна (рис. 4.2-б, в, г, д). а) б) 1001 в) г) д) Рис. 4.2. Последовательное применение алгоритма Сазерленда-Ходгмана для отсечения многоугольника относительно видимого окна. На вход алгоритма поступает последовательность вершин исходного многоугольника. Алгоритм последовательно «обходит» по периметру весь многоугольник, проверяя на каждом шаге соотношение между последовательными вершинами и отсекающей границей. В выходной список вершин последовательно заносятся координаты вершин многоугольника, лежащие внутри отсекающей границы, и координаты точек пересечения ребер многоугольника с границей. То есть, если ребро полностью лежит внутри границы, то в выходной список заносятся обе вершины; если ребро сечется границей, то в выходной список заносятся вершина, лежащая внутри отсекаемой области, и точка пересечения ребра с отсекающей границей. 5. АФФИНЫЕ ПРЕОБРАЗОВАНИЯ Геометрические преобразования широко применяются в компьютерной графике при выводе изображения на экран и проведении с ним разнообразных действий [2, 10, 14, 16, 17]. Перед тем, как приступить к рассмотрению различных случаев аффинных преобразований, определим используемые системы координат. Аффинные преобразования рассматриваются в прямоугольных декартовых системах координат. На плоскости используется правосторонняя система координат – ось х (ось абсцисс) направлена направо, ось у – вверх, за положительное направление поворота принято направление против часовой стрелки. Трехмерная система координат правосторонняя – ось z (ось аппликат) направлена на наблюдателя; положительное направление поворота – против часовой стрелки, если смотреть из конца положительной полуоси в начало координат. 5.1. Аффинные преобразования на плоскости Пусть на плоскости в прямоугольной системе координат задана точка N (х, у), которая в результате последовательных преобразований переводится в точку N* с координатами (х*, у*). В случае аффинных преобразований координаты конечной точки можно описать уравнениями вида: x* = axx + bxy + cx, y* = ayx + byy + cy, где ax, bx, cx, aу, bу и cу – некоторые коэффициенты. В аффинных преобразованиях на плоскости особую роль играют несколько важных частных случаев (поворот, масштабирование, отражение и перенос), имеющих хорошо прослеживаемые геометрические характеристики [7]. Поворот вокруг начала координат на угол описывается следующими уравнениями (рис. 5.1): у x* = x cos - y sin, y* = x sin + y cos. N* N х Рис. 5.1. Поворот вокруг начала координат Растяжение-сжатие (масштабирование) вдоль координатных осей и относительно начала координат: x* = Mx x, y* = My y. Mx > 0, My > 0. Растяжение вдоль оси абсцисс (ординат) имеет место при Mx > 1 (My> 1), сжатие – при Mx < 1 (My < 1). Отражение относительно координатных осей (рис. 5.2) описывается следующими уравнениями: относительно оси абсцисс у N x* = x, y* = -y; относительно оси ординат х x* = -x, y* = y. N* Рис. 5.2. Отражение относительно оси абсцисс Перенос точки вдоль оси абсцисс на величину x, и на величину y вдоль оси ординат: x* = x + x, y* = y + y. В компьютерной графике чаще используется матричная запись этих формул. Матрицы, соответствующие случаям поворота, масштабирования и отражения, строятся легко, но для записи уравнений переноса в матричной форме приходится использовать однородные координаты. Пусть N – произвольная точка плоскости с координатами x и y. Однородными координатами этой точки называется любая тройка одновременно не равных нулю чисел x1, x2, x3, связанных с заданными числами x и y следующими соотношениями: x = x1 / x3, y = x2 / x3, x3 0. В проективной геометрии для однородных координат принято следующее обозначение: x:y:1 (третья координата равна единице, поэтому операции деления не требуется; более общая форма записи x1 : x2 : x3 ). При помощи троек однородных координат и матриц третьего порядка можно описать любое аффинное преобразование на плоскости уравнениями вида: x * x y * = [P] y , 1 1 где x * y * 1 и двумерного случая размер 3X3. x y 1 – векторы-столбцы координат конечной и начальной точек соответственно, [P] – матрица соответствующего преобразования, имеющая для Поворот: x * y * 1 cos = sin 0 sin cos 0 0 1 0 x y , 1 Масштабирование: x * y * 1 Mx 0 0 0 My 0 = 0 0 1 x y , 1 Mx > 0, My > 0. Отражение: относительно оси абсцисс x * y * 1 относительно оси ординат 1 0 0 x 1 0 y . = 0 0 0 1 1 x * y * 1 1 0 0 x 0 1 0 y . = 0 0 1 1 Перенос: x * y * 1 1 0 x x 1 y y . = 0 0 0 1 1 5.2. Аффинные преобразования в пространстве Общее уравнение трехмерного аффинного преобразования: x* = axx + bxy + cxz + dx, y* = ayx + byy + cyz + dy, z* = azx + bzy + czz + dz, где ax, bx, cx, dx, aу, bу, cу, dy, az, bz, cz и dz – некоторые коэффициенты. В пространственных преобразованиях выделяются те же основные частные случаи, что и в двумерных преобразованиях. Повороты. Поворот вокруг оси абсцисс (оси х) на угол : x* = x, y* = y cos - z sin, z* = z cos + y sin. В матричной форме с использованием однородных координат: 0 x * 1 y * 0 cos z * 0 sin 0 1 0 0 sin cos 0 0 x 0 y 0 z 1 1 . Поворот вокруг оси ординат (оси у) на угол : x* = x cos + z sin, y* = y, z* = z cos - x sin. x * cos y * 0 В матричной форме: z * sin 1 0 Поворот вокруг оси аппликат (оси z) на угол : x* = x cos - y sinx, y* = y cos + x sin, z* = z. 0 sin 1 0 0 cos 0 0 0 x 0 y 0 z 1 1 . x * cos y * sin Или, в матричной форме: z * 0 1 0 sin cos 0 0 0 0 x 0 0 y 1 0 z 0 1 1 . В случае поворотов в отрицательных направлениях значения углов берутся со знаком минус и используются тождества: cos(-) = cos, sin(-) = -sin. Трехмерный перенос является простым расширением двумерного случая: x* x x, y* y y, z* z z. x * 1 y * 0 z * 0 1 0 или 0 0 x x 1 0 y y . 0 1 z z 0 0 1 1 Иногда необходимо выполнить перенос на величину, не являющуюся константой, а зависящую от начальных координат точки [11]. Это преобразование описывается следующими формулами: x* x ay bz , y* y cx dz , z* z ex fy. или x * 1 y * c z * e 1 0 a 1 f 0 b 0 x d 0 y . 1 0 z 0 1 1 Масштабирование описывается следующими уравнениями: x* = Mxx, y* = Myy, Mx>0, My>0, Mz>0. z* = Mzz. x * Mx 0 y * 0 My Или: z * 0 0 0 1 0 0 0 x 0 0 y . Mz 0 z 0 1 1 В отличие от двумерного случая, в пространстве рассматриваются случаи отражения относительно координатных плоскостей. Отражение относительно плоскости z = 0: x* x, y* y, z* z. 0 0 0 x 1 0 0 y . 0 1 0 z 0 0 1 1 Отражение относительно плоскости у = 0: x* x, y* y, z* z. или x * 1 y * 0 z * 0 1 0 или x * 1 0 y * 0 1 z * 0 0 1 0 0 0 0 x 0 0 y . 1 0 z 0 1 1 Отражение относительно плоскости х = 0: x* x, y* y, z* z. или x * 1 y * 0 z * 0 1 0 0 0 0 x 1 0 0 y . 0 1 0 z 0 0 1 1 5.3. Композиция преобразований Любое аффинное преобразование на плоскости или в пространстве можно представить как последовательное исполнение рассмотренных выше частных случаев. При таком подходе итоговую матрицу преобразования вычисляют как произведение матриц частных случаев, из которых складывается итоговое преобразование. Следует помнить, что перемножение матриц является некоммутативной операцией, т.е. важен порядок ее выполнения. Правильный порядок перемножения определяется положением матрицы частного преобразования относительно матрицы координатного вектора. Матрица, ближайшая к матрице координатного вектора, задает первое частное преобразование; а наиболее удаленная от него матрица задает последнее частное преобразование. Пусть точка М с координатами (х, у, z) последовательно подвергается преобразованиям вида P1, P2, …, Pn. Причем, [P1] – матрица первого преобразования (размером 4х4), а [Pn] – последнего. Итоговые координаты точки (х*, у*, z*) могут быть вычислены по уравнению: x * x y * = [P ] …[P ] [P ] y , z * z 1 1 n 2 1 или, в другой форме записи: (x* y* z* 1) = (x y z 1) [P1]Т [P2]Т … [Pn]Т, где [Pi]Т – транспонированная матрица [Pi]. Во второй форме записи координаты точек записываются как векторы-строки, а не вектора-столбцы. 6. ПРОЕЦИРОВАНИЕ В настоящее время абсолютное большинство устройств вывода графической информации создают изображения на плоскости – экране монитора, бумаге и т.п. Несоответствие между объемными объектами и плоскими изображениями устраняется путем введения проекций, которые отображают трехмерные объекты на двумерной картинной плоскости. Проекция объекта на картинную плоскость строится при помощи проецирующих лучей, которые выходят из одной точки (центра проекции) и проходят через каждую точку объекта. Пересечение этих лучей с картинной плоскостью и образует проекцию. В зависимости от удаленности центра проекции и взаимного расположения картинной плоскости, проецирующих лучей и осей координат выделяется несколько видов проекций (рис. 6.1) [10, 14, 16, 17]. Проекции Параллельные проекции Ортографическая Триметрическая Перспективные проекции Аксонометрическая Косоугольная Трехточечная Двухточечная Изометрическая Диметрическая Кабине Одноточечная Кавалье Рис. 6.1. Виды проекций. При параллельном проецировании центр проекции считается лежащим в бесконечности (проецирующие лучи параллельны друг другу), а при перспективном (центральном) проецировании расстояние между центром проекции и картинной плоскостью конечно. 6.1. Виды параллельных проекций В ортографических и аксонометрических проекциях проецирующие лучи перпендикулярны картинной плоскости (направление проецирования совпадает с нормалью к проекционной плоскости). Во всех параллельных проекциях грани отображаемого объекта, параллельные картинной плоскости, изображаются без искажения формы и размеров; параллельные в пространстве прямые сохраняют параллельность и после проецирования, а также остаются постоянными относительные длины параллельных в исходном пространстве линий. Самой простой из параллельных проекций является ортографическая проекция, при которой картинная плоскость совпадает с одной из координатных плоскостей или параллельна ей (рис. 6.2), а проецирующие лучи параллельны одной из координатных осей. y z Рис. 6.2. Ортографическая проекция на плоскость z = 0. x Матрица проецирования на координатную плоскость z = 0 имеет вид: [Pорт z 1 0 ]= 0 0 0 0 0 1 0 0 0 0 0 0 0 1 , а при проецировании на параллельную ей плоскость z = r: [Pорт z 1 0 ]= 0 0 0 0 0 1 0 0 0 0 r 0 0 1 . Аналогично, матрицы проецирования на плоскости x = p и y = q равны: [Pорт x 0 0 ]= 0 0 0 0 p 1 0 0 0 1 0 0 0 1 , [Pорт y 1 0 ]= 0 0 0 0 0 0 0 q 0 1 0 0 0 1 . Наиболее часто используются наборы ортографических проекций отдельных сторон объекта (вид спереди, вид сверху, вид сбоку). В аксонометрических проекциях нормаль к картинной плоскости (а, следовательно, и направление проецирования) не совпадает ни с одной из координатных осей (рис. 6.3). у нормаль х картинная плоскость z Рис. 6.3. Аксонометрическая проекция. В зависимости от взаимного расположения картинной плоскости и осей координат выделяют следующие виды аксонометрических проекций: а) триметрия – нормаль к картинной плоскости образует с координатными осями попарно различные углы ( , , ); б) диметрия – два угла между нормалью к картинной плоскости и координатными осями равны; в) изометрия – все три угла между нормалью к картинной плоскости и координатными осями равны ( = = ). Каждая из этих проекций получается комбинацией поворотов с последующим параллельным проецированием. Триметрическая проекция строится последовательными поворотами вокруг координатных осей, совершаемыми в произвольном порядке, с последующим проецированием на плоскость z = 0. Коэффициенты искажения (отношение длины проекции отрезка к его истинной длине) по каждой из проецируемых координатных осей не равны друг другу. Диметрия – это частный случай триметрической проекции с двумя одинаковыми коэффициентами искажения (третий коэффициент может иметь любое значение). Диметрическая проекция может быть получена путем поворота на угол вокруг оси ординат, затем поворота на угол вокруг оси абсцисс и проецирования вдоль оси аппликат: [Pдим 1 0 ]= 0 0 0 0 0 1 0 1 0 0 0 cos 0 0 0 0 sin 0 0 1 0 0 cos sin sin = 0 0 0 sin cos 0 0 cos 0 sin cos sin 0 0 0 0 cos 0 0 0 sin 1 0 0 sin 1 0 0 cos 0 0 0 0 0 1 = 0 0 . 0 1 Найдем величины этих углов поворота. Квадраты длин проекций единичных векторов координатных осей, совпадающие с коэффициентами искажения по этим осям, равны: fx2 = cos2 + sin2 sin2, fy2 = cos2, fz2 = sin2 + cos2 sin2. Приравнивая любые два коэффициента искажения получают ограничения, налагаемые в случае диметрии на значения углов и . Если fх2 = fy2, то: = arcsin(fz = arcsin(fz / 2 fz 2 ), 2 ). В изометрической проекции все три коэффициента искажения равны: fх2 = fy2 = fz2. Для изометрии получаем: sin2 = ½, = 450, sin2 = 1/3, = 35,260. При косоугольных проекциях проецирующие прямые не перпендикулярны картинной плоскости, картинная плоскость совпадает с одной из координатных плоскостей или параллельна ей. Таким образом, косоугольные проекции сочетают в себе свойства ортографических и аксонометрических проекций. Косоугольная проекция на плоскость z = 0 задается значениями двух углов: и , где – это угол между осью абсцисс и проекцией оси аппликат на картинную плоскость, а – это угол наклона проецирующих прямых к картинной плоскости (рис. 6.4). y a N*(a, b) f b x N(0, 0, 1) z Рис. 6.4. Косоугольная проекция точки N(0, 0, 1) на плоскость z =0. Рассмотрим косоугольную проекцию точки N(0, 0, 1) на плоскость z=0. В результате проецирования точка N преобразуется в точку N*(a, b). Коэффициент искажения f по оси аппликат равен длине проекции единичного вектора (0 0 1): f = ctg. Косоугольная проекция любой точки получается путем сдвига на величину za вдоль оси x, на величину zb вдоль оси y и последующего проецирования на плоскость z=0. Матрица косоугольной проекции: [Pкос] = 1 0 0 0 0 a 0 1 b 0 , 0 0 0 0 0 1 a = f cos, b = f sin. Наиболее часто используют две косоугольных проекции – кавалье и кабине. Проекция кавалье получается, когда угол между картинной плоскостью и проецирующими прямыми =450. В этой проекции коэффициенты искажения для каждой из проецируемых координатных осей одинаковы и равны единице (т.е. без искажения): f=1, a=cos, b=sin. Результат проекции кавалье выглядит неестественно утолщенным. У проекции кабине коэффициент искажения для ребер, перпендикулярных картинной плоскости, составляет ½: f=1/2, a=0,5cos, b=0,5sin. Для получения проекции кабине угол между картинной плоскостью и проецирующими прямыми должен составлять 63.43 0. Угол может быть любым, однако, наиболее часто используются проекции со значениями угла =300 или =450. 6. 2. Центральные (перспективные) проекции В центральных проекциях грани отображаемого объекта, параллельные картинной плоскости, изображаются без искажения формы, но с искажением размера. Центральные проекции любой совокупности параллельных прямых, которые не параллельны картинной плоскости, будут сходиться в точке схода. Точка схода прямых, параллельных одной из координатных осей, называется главной точкой схода. Т.к. координатных осей три, то и главных точек схода не может быть больше трех. В зависимости от расположения осей координат и картинной плоскости различают одно-, двух- и трехточечные центральные проекции. Одноточечная проекция получается, когда картинная плоскость совпадает с одной из координатных плоскостей (или параллельна ей). Т.е., только одна ось координат не параллельна картинной плоскости и имеет главную точку схода. Двухточечная проекция получается, когда только одна из координатных осей параллельна картинной плоскости. Две другие оси координат не параллельны картинной плоскости и имеют две главные точки схода. При изображении объектов, расположенных на поверхности земли, наиболее часто используется двухточечная проекция, при которой картинной плоскости параллельна вертикальная ось координат. Обе главные точки схода расположены на одной горизонтальной линии – линии горизонта (рис. 6.5). При трехточечной проекции все три координатные оси не параллельны картинной плоскости и, следовательно, имеются три главные точки схода. линия горизонта Рис. 6.5. Двухточечная центральная проекция. Рассмотрим более подробно случай одноточечного проецирования точки Р на плоскость z=0 с центром проецирования С, лежащим на оси z (рис. 6.6). y N*(x*, y*, 0) N(x, y, z) z x С(0, 0, zc) Рис. 6.6. Одноточечное проецирование. Одноточечное проецирование будет задаваться формулами: 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 x 1 1 0 0 y 0 0 1 0 z 0 0 r 1 1 0 0 0 0 x x 1 0 0 y y , где r = -1/z . 0 0 0 z 0 0 r 1 1 rz 1 c Однородные координаты точки N* получаются после деления на величину rz+1: x* x /( rz 1), y* y /( rz 1), z* 0, или x * x /( rz 1) y * y /( rz 1) . z * 0 1 1 При удалении центра проекции в бесконечность (zc, r0) центральная проекция переходит в ортографическую. Из-за особенностей человеческого зрения к удаленным от наблюдателя объектам лучше применять перспективную проекцию, к достаточно близким (на расстоянии вытянутой руки) – ортографическую или аксонометрическую, а к еще более близким объектам – обратную перспективную проекцию. Для создания стереоизображений используются две центральные проекции, центры которых совпадают с расположением глаз гипотетического наблюдателя, т.е. они расположены на некотором расстоянии друг от друга на прямой, параллельной картинной плоскости. После выполнения проецирования получают два изображения объекта – для левого и правого глаза. Устройство вывода должно обеспечивать подачу этих изображений к каждому глазу пользователя отдельно. Для этого может использоваться система цветных или поляризационных фильтров. Более сложные устройства вывода (например, шлемы) подают каждое из изображений на отдельные экраны для каждого глаза. Все рассмотренные выше проекции относятся к классу плоских геометрических проекций, т.к. проецирование производится на плоскость (а не искривленную поверхность) и с помощью пучка прямых линий (а не кривых). Этот класс проекций наиболее часто используются в компьютерной графике. В отличие от нее, в картографии часто используются неплоские или негеометрические проекции. 6.3. Системы координат в компьютерной графике При визуализации объектов на экране монитора или печатающем устройстве необходимо знать его координаты. В компьютерной графике основными являются две системы координат – мировые координаты, описывающие истинное положение объектов в пространстве с заданной точностью, и координаты устройства вывода (например, экрана), на котором осуществляется визуализация. Цепочку преобразований от мировых к экранным координатам можно представить в следующем виде (рис. 6.7) [10, 14]: Мировые координаты трехмерные аффинные преобразования Видовые координаты проецирование Координаты проекции Экранные координаты двумерные аффинные преобразования Рис. 6.7. Переход от мировых координат объекта к экранным. Видовые координаты применяются в случае необходимости и определяются видом последующего проецирования. При переходе от мировых координат к видовым могут выполняться: смена системы координат (например, правосторонней декартовой на левостороннюю), разворот системы координат в пространстве в соответствии с выбранным направлением проецирования, отсечение координат объекта по выбранному видимому объему. Координаты проекции получаются после применения операции проецирования к видовым координатам объекта. В случае визуализации двумерных объектов мировые координаты и координаты проекции совпадают (проецирования не требуется). Для каждого конкретного случая визуализации цепочка преобразований систем координат может сильно отличаться от приведенной. Самый крайний случай – когда мировые координаты объекта сразу заданы в экранных пикселях и никаких преобразований не требуется. 7. МЕТОДЫ И АЛГОРИТМЫ ТРЕХМЕРНОЙ ГРАФИКИ 7.1. Геометрические модели трехмерных объектов Геометрические модели описывают предметы и явления, обладающие геометрическими свойствами. Необходимость в описании пространственных объектов возникает при решении многих задач компьютерной графики. В общем случае реально существующий объект не может, конечно, в точности соответствовать своему описанию. Для этого бы потребовалось бесконечное число троек координат (x, y, z) – по одной для каждой точки поверхности объекта. В настоящее время при моделировании объектов используют несколько основных типов геометрических моделей [10, 14, 20]. Для описания каркасной модели используются геометрические объекты первого порядка – линии или ребра. Каркасные модели применяют, как правило, для задания объектов, представляющих собой полиэдры, т.е. замкнутые многогранники произвольной формы, ограниченные плоскими гранями. Каркасная модель содержит в этом случае список координат вершин полиэдра с указанием связей между ними (т.е. указанием ребер, ограниченных соответствующими вершинами). При использовании каркасной модели для описания объектов, ограниченных поверхностями более чем первого порядка, такие поверхности интерполируют плоскими гранями. Каркасное представление объекта часто используется не при моделировании, а при отображении моделей как метод визуализации. Преимуществами каркасной модели являются низкие требования к вычислительным ресурсам, недостатком – невозможность построения высоко реалистичных изображений, так как совокупность отрезков не является адекватным описанием объекта – отрезки сами по себе не определяют поверхностей (рис. 7.1). а) б) в) Рис. 7.1. Одна и та же каркасная модель (а) может описывать и куб (б), и открытую сверху коробку (в). Развитием каркасной модели является кусочно-аналитическая граневая модель, которая задается перечислением всех отдельных граней. Объект задается множеством ограничивающих его граней и нормалью, направленной из объекта; каждая грань задается циклом ограничивающих ее ребер; каждое ребро – двойкой ограничивающих его точек (вершин); каждая точка – тройкой координат в трехмерном пространстве. Т.е. граневая модель представляет трехмерный объект в виде замкнутой поверхности. Совокупность граней, представленных плоскими многоугольниками и ограниченных прямолинейными ребрами, образует полигональную сетку. Грани могут иметь любую форму, но в подавляющем большинстве случаев используются выпуклые многоугольники с минимальным количеством вершин (треугольники и четырехугольники), т.к. их обсчет выполняется проще. Основным недостатком полигональной сетки является приблизительность представления формы объекта при описании искривленных поверхностей. Для улучшения кусочно-линейной аппроксимации таких объектов увеличивают число граней, что приводит к дополнительным затратам памяти и увеличению объема вычислений. В рамках граневой модели грани могут представлять собой и искривленные поверхности, ограниченные криволинейными ребрами. Наиболее часто в качестве граней используются параметрические бикубические куски, ограниченные параметрическими кубическими кривыми. При использовании бикубических кусков для представления объекта с заданной точностью требуется значительно меньшее число граней, чем при аппроксимации полигональной сеткой. Однако, вычисления при работе с бикубическими поверхностями значительно сложнее, чем при работе с плоскими гранями. В отличие от граневой модели, объемно-параметрическая модель рассматривает объект как сплошное тело. Объект описывается как совокупность некоторых базовых объемных элементов формы (объемных примитивов). Каждый примитив в модели задается двумя группами параметров: размерные параметры – определяют геометрические размеры примитива; параметры положения – устанавливают положение и ориентацию примитива относительно мировой системы координат. В качестве примитивов используются простые геометрические тела: цилиндр, конус, усеченный конус, параллелепипед, шар, тор. В качестве параметров положения обычно используют координаты центральной точки примитива и координаты единичного вектора, направленного вдоль высоты примитива. Кроме этих параметров задаются операции над примитивами, в качестве которых используются три основные операции теории множеств – объединение, пересечение и вычитание. Объединением двух примитивов является объект, включающий все точки исходных примитивов. Пересечением двух примитивов является объект, все точки которого принадлежат одновременно и первому, и второму примитиву. Результатом вычитания двух примитивов является объект, состоящий из тех точек первого примитива, которые не принадлежат второму примитиву [20]. Недостатком объемно-параметрической модели является отсутствие явных границ отсеков граней в случае взаимопроникновения примитивов. В рамках кинематической модели объект может быть задан совокупностью объемных элементов, каждый из которых представляет собой объем, «вырезаемый» в пространстве при движении по определенной траектории замкнутого плоского контура. Траектория движения контура может быть как прямой, так и искривленной. Вид элемента определяется формой контура и траекторией его движения. Например, цилиндр в рамках кинематической модели может быть описан как движение круга вдоль отрезка, представляющего собой высоту цилиндра. Для моделирования элементов сложной формы можно использовать изменение размеров контура или его положения относительно траектории во время движения. Достоинством модели является практическое отсутствие ограничений на сложность формируемого объекта. К недостаткам относится сложность задания элементов. 7.2 Полигональные сетки Полигональные сетки представляют собой совокупность вершин, ребер и многоугольников. Сетку можно представить несколькими различными способами [14]. При явном задании многоугольников каждый многоугольник представляется в виде списка координат его вершин: P = ((x1, y1, z1), (x2, y2, z2), …(xn, yn, zn)). Вершины многоугольника запоминаются в том порядке, в котором они встречаются при обходе вокруг многоугольника. Все последовательные вершины многоугольника, а также первая и последняя вершины, соединяются ребрами. Этот способ записи является эффективным для каждого отдельного многоугольника. Для полигональной сетки этот метод приводит к большим потерям памяти из-за дублирования информации о координатах общих вершин многоугольников, а также не дает явного описания общих ребер и вершин. Для поиска всех многоугольников, имеющих общую вершину, требуется сравнение троек координат одного многоугольника с тройками координат всех остальных многоугольников. Если же из-за ошибок округления одна и та же вершина в разных многоугольниках имеет разные координаты, то результат поиска может быть нулевой. При визуализации полигональной сетки общие ребра рисуются дважды – по одному разу для каждого многоугольника. При задании многоугольников с помощью указателей в список вершин каждый узел полигональной сетки запоминается лишь один раз в списке вершин. Каждый многоугольник определяется списком указателей в список вершин. Этот метод требует меньшего объема памяти, но общие ребра многоугольников по-прежнему рисуются дважды. При явном задании ребер многоугольников полигональная сетка задается в виде иерархической модели. Координаты каждого узла полигональной сетки запоминаются в списке вершин. Создается список ребер, где каждое ребро указывает на две вершины в списке вершин. Каждый многоугольник задается как совокупность указателей на элементы списка ребер. Полигональная сетка изображается вычерчиванием всех ребер (а не всех многоугольников). Заданную таким способом полигональную сетку наиболее просто проверять на непротиворечивость представления, т.е. на выполнение некоторых условий: что все многоугольники замкнуты, что все ребра используются по крайней мере один раз, но не более некоторого максимального числа раз, что на каждую вершину есть ссылка по крайней мере от двух ребер и т.п. Проверка непротиворечивости представления наиболее важна для полигональных сеток, созданных в интерактивном режиме (например, при оцифровке объектов), когда ошибки практически неизбежны. 7.3. Параметрические кубические кривые Для визуализации кривых линий с помощью компьютера надо знать их математическое описание [7, 10, 11, 14, 16, 18 20]. Существуют два основных способа представления кривых. Первый способ заключается в задании кривой с помощью функций переменных x, y, z: z = f(x, y), или F(x, y, z) = 0. Этот способ представления влечет за собой многие ограничения, особенно, если некоторым значениям координат x и y будут соответствовать несколько значений z, т.е. если кривая образует петлю. Кроме того, в некоторых точках кривой значение тангенса угла наклона может оказаться равным бесконечности. Эти проблемы снимаются в случае параметрического способа представления кривых, когда координаты x, y и z описываются как функции от некоторого параметра t: x = f(t), y = f(t), z = f(t). При таком способе представления легко описываются замкнутые и многозначные функции, а вместо тангенсов углов наклона используются касательные вектора, которые никогда не бывают бесконечными. В качестве функций от параметра t наиболее часто используются многочлены третьей степени (кубические): x(t) = axt3 + bxt2 + cxt + dx, y(t) = ayt3 + byt2 + cyt + dy, z(t) = azt3 + bzt2 + czt + dz. Формулы для x(t), y(t) и z(t) аналогичны друг другу, поэтому далее будут рассматриваться только уравнения для координаты x. Диапазон изменения параметра t может быть любым, но наиболее часто его ограничивают 0 t 1. Все последующие выводы будут рассмотрены для этого диапазона. Значение касательного вектора к кривой определяется как первая производная функции x(t) по параметру t: dx/dt = 3axt2 + 2bxt + cx. Кривая линия описывается как последовательность отдельных сегментов параметрических кубических кривых. В точках соединения сегментов должна соблюдаться непрерывность самой кривой (без разрывов) и непрерывность касательных векторов (без изменения наклона). Многочлены более низкой степени, чем третья, не могут обеспечить выполнения этих условий. При использовании многочленов более высоких степеней увеличивается сложность расчетов, возникают нежелательные осцилляции кривых. Существует несколько способов описания параметрических кубических кривых. Рассмотрим основные: формы Эрмита, Безье и В-сплайны. Каждая из этих форм имеет свои достоинства и недостатки. В рамках формы Эрмита кривая задается через координаты конечной и начальной точек (P1 и Р4) и значений касательных в этих точках (R1 и R4). Точкам присваиваются индексы 1 и 4, а не 1 и 2 для совместимости с выражениями, которые используются при построении кривых методами Безье и В-сплайнов. При этом полагают, что для начальной точки t=0, а для конечной t=1. Перепишем формулы для функции x(t) и касательной x’(t) в матричном виде: x(t) = [t3, t2, t, 1] ax bx cx dx = T Cx, x’(t) = [3t2, 2t, 1, 0] Cx. Задача построения кривой сводится к нахождению значений элементов матрицы Cx (т.е. коэффициентов ax, bx, cx, dx), удовлетворяющих условиям: х(0) = Р1х = [0, 0, 0, 1] Сх, х’(0) = R1х = [0, 0, 1, 0] Сх, х(1) = Р4х = [1, 1, 1, 1] Сх, х’(1) = R4х = [3, 2, 1, 0] Сх. Объединяя полученные выражения в одно матричное уравнение, получим: Ghx P1x P4 x = R1x R4 x 0 1 = 0 3 0 0 1 1 1 1 С. 0 1 0 2 1 0 х Искомое выражение для Сх: 1 P1x 2 2 1 3 3 2 1 P 4 x С = 0 0 1 0 R1x 0 0 0 R4 x 1 х = Mh Ghx, где Mh – эрмитова матрица, Ghx – геометрический вектор Эрмита. Итоговое уравнение для координаты х: x(t) = T Mh Ghx = P1x(2t3 – 3t2 + 1) + P4x(– 2t3 + 3t2) + + R1x(t3 – 2t2 + t) + + R4x(t3 – t2). Недостатком формы Эрмита является необходимость явного задания значения касательных векторов в концевых точках кривой, что не всегда удобно при реализации интерактивных режимов аппроксимации, кроме того, само понятие вектора незнакомо некоторым пользователям. Форма Эрмита удобна при аппроксимации уже имеющихся кривых, когда приблизительно известны длина или направление касательных векторов. Для обеспечения условий непрерывности при стыковке сегментов кривой необходимо, чтобы конечная точка первого сегмента совпадала с начальной точкой второго сегмента, а касательные вектора к сегментам в этих точках имели одинаковое направление (длина векторов может быть разной): P4I = P1II, R4I = kR1II. В форме Безье для задания кубической кривой используются четыре управляющих точки: Р1, Р2, Р3 и Р4. Данная форма задания кубической кривой очень близка к эрмитовой форме, но касательные вектора в конечных точках R1 и R4 задаются отрезками Р1Р2 и Р3Р4: R1x = 3(Р2x – Р1x) = x’(0), R4x = 3(Р4x – Р3x) = x’(1). Переход от геометрического вектора Безье Gb к геометрическому вектору Эрмита Gh определяется как: Ghх P1х P4 х = R1х Rх 4 1 0 = 3 0 0 1 0 0 3 3 0 0 3 0 0 0 P1х P2 х P3х P4 х = Mhb Gbх, где Mhb – матрица перехода от геометрического вектора Безье к геометрическому вектору Эрмита. Выражение для функции выглядит x(t) так: x(t) = T Mh Ghx = T Mh Mhb Gbx = T Mb Gbx, Mb = Mh Mhb 1 3 3 3 6 3 = 3 3 0 0 0 1 1 0 . 0 0 Отсюда: x(t) = (1 – t)3P1x + 3t(t – 1)2P2x + 3t2(1 – t)P3x + t3P4x. Форма Безье наиболее удобна при аппроксимации кривых, заданных набором точек. В компьютерной графике чаще используется форма Безье, чем форма Эрмита. Четыре управляющих точки в форме Безье определяют выпуклый четырехугольник, внутри которого находится сама кривая. Выпуклый многоугольник оказывается полезным при выполнении многих операций, например, при отсечении кривой по видимому объему. При выполнении этой операции вместо того, чтобы сразу проводить проверку отсечения кривой, сначала проверяется ее выпуклая оболочка и только в случае пересечения выпуклой оболочкой видимого объема возникает необходимость в проверке самой кривой. Для обеспечения условий непрерывности при соединении сегментов кривой необходимо, чтобы конечная точка первого сегмента совпадала с начальной точкой второго сегмента, а точки P3I и P2II лежали на одной прямой, проходящей через точку соединения сегментов: P4I = P1II, (P4I – P3I) = k(P2II – P1II). Форма В-сплайнов является более гладкой, чем другие формы представления, т.к. непрерывностью изменения обладают ее касательный вектор и кривизна (т.е. первая и вторая производные кривой непрерывны в конечных точках) в отличие от форм Эрмита и Безье (у которых в конечных точках непрерывны лишь первые производные) [11, 14, 20]. Термин «сплайн» происходит от названия длинных гибких реек, которыми пользовались чертежники при разметке поверхности самолетов, кораблей. В-сплайн описывается следующей формулой: x(t) = T Ms Gsx, где 1 3 3 3 6 3 M = 1/6 3 0 3 4 1 1 s 1 0 . 0 0 При аппроксимации управляющих точек Р1, Р2, …, Рn последовательностью В-сплайнов между каждой парой соседних точек Рi и Рi+1 последовательно используются геометрические матрицы: Gisх Pi 1 Pi , = Pi 1 Pi 2 2 i n – 2. В общем случае управляющие точки В-сплайна не лежат на кривой, однако, при определенных условиях В-сплайн может проходить через любые управляющие точки. В-сплайн, описываемый приведенной выше формулой, пройдет через управляющую точку Рi в случае, если точки Рi, Рi+1 и Рi+2 совпадают. Обычно форму В-сплайнов применяют для аппроксимации продолжительных отрезков кривых, задаваемых значительным (более пяти) числом управляющих точек. Наиболее широко в компьютерной графике используются так называемые неравномерные рациональные В-сплайны (NURBS – Non-Uniform Rational B-Splines). NURBS широко применяются в системах геометрического моделирования и трехмерной графике. 7.4. Параметрические бикубические поверхности Параметрические бикубические поверхности задаются многочленами третьей степени от двух параметров s и t. Как и прежде, будем рассматривать только уравнение для координаты х: x(s, t) = a11xs3t3 + a12xs3t2 + a13xs3t + a14xs3 + + a21xs2t3 + a22xs2t2 + a23xs2t + a24xs2 + + a31xst3 + a32xst2 + a33xst + a34xs + + a41xt3 + a42xt2 + a43xt + a44x. Или: a11x a 21x x(s, t) = [s s s 1] a31x a 41x 3 2 a12 x a 22 x a13x a 23x a32 x a 42 x a33x a 43x a14 x t 3 a 24 x t 2 a34 x t a 44 x 1 = S Cx TT, где: S = [s3 s2 s 1], T = [t3 t2 t 1], TT – транспонированная матрица Т. Матрица Сx задает коэффициенты бикубического многочлена. Существуют еще матрицы Сy и Сz, которые определяют коэффициенты бикубических уравнений y(s, t) и z(s, t). Изменяя оба параметра s и t от 0 до 1, можно определить все точки на куске поверхности. Если одному из параметров присвоить постоянное значение, а второй параметр изменять в пределах 0…1, то в результате получается кубическая кривая. Форма Эрмита для задания бикубической поверхности: перепишем уравнение кубической кривой Эрмита от параметра s так, чтобы геометрический вектор Эрмита был не константой, а функцией от параметра t: x(s, t) = S Mh Ghx(t) = S Mh P1x (t ) P 4 x (t ) . R1x (t ) R 4 x (t ) При фиксированном значении параметра t функции P1x(t) и P4x(t) описывают х-компоненты начальной и конечной точек кривой, задаваемой параметром s. Аналогично, R1x(t) и R4x(t) описывают касательные векторы в конечных точках кубической кривой. Каждая из кривых P1x(t), P4x(t), R1x(t), R4x(t) представлена кубическим многочленом в форме Эрмита: P1x(t) = T Mh q11x q12 x , q13x q14 x R1x(t) = T Mh q 31x q 32 x , q 33 x q 34 x P4x(t) = T Mh q 21x q 22 x , q 23 x q 24 x R4x(t) = T Mh q 41x q 42 x . q 43 x q 44 x Объединяя эти выражения, получим: x(s, t) = S Mh Qhx MhT TT = S Mh q11x q12 x q13x q14 x q 21x q 22 x q 23x q 24 x q 31x q 32 x q 33x q 34 x q 41x q 42 x q 43x q 44 x MhT TT. Таким образом, бикубическая поверхность Эрмита задается 16 параметрами, из которых: q11x = x(0, 0), q12x = x(0, 1), q21x = x(1, 0), q22x = x(1, 1) – координаты углов куска поверхности; q13x = dx/dt (0, 0), q14x = dx/dt (0, 1), q23x = dx/dt (1, 0), q24x = dx/dt (1, 1), q31x = dx/ds (0, 0), q32x = dx/ds (0, 1), q41x = dx/ds (1, 0), q42x = dx/ds (1, 1) – х-компоненты касательных векторов в угловых точках для каждой из ограничивающих кусок поверхности параметрических кривых; q33x = d2x/dsdt (0, 0), q34x = d2x/dsdt (0, 1), q43x = d2x/dsdt (1, 0), q44x = d2x/dsdt (1, 1) – частные производные по обоим параметрам s и t в угловых точках куска поверхности (кривизна). При соединении кусков бикубических поверхностей должны выполняться условия непрерывности: кривые, заданные на общем ребре, должны быть одинаковыми (должны совпадать начальные и конечные точки кривых и значения касательных векторов к кривым в этих точках); касательные вектора, пересекающие ребро, должны иметь одно и тоже направление для обоих сочленяющихся кусков. Уравнения для кусков Безье выводятся также, как и для формы Эрмита. В результате получается: x(s, t) = S Mb Pbx MbT TT = S Mb P11x P 21x P31x P 41x P12 x P 22 x P32 x P13x P 23x P33x P 42 x P 43x P14 x P 24 x P34 x P 44 x MbT TT. Геометрическая матрица Рbx состоит из 16 управляющих точек, причем точки Р11х, Р14х, Р41х и Р44х являются угловыми точками куска поверхности. Поверхности Безье, также как и кривые, обладают свойством выпуклых оболочек. При соединении двух кусков поверхностей для выполнения условия непрерывности необходимо равенство четырех управляющих точек, принадлежащих общим ребрам кусков. Кроме того, для достижения непрерывности касательного вектора требуется, чтобы две четверки управляющих точек, лежащих по обеим сторонам общего ребра были коллинеарны (лежали на одной прямой) четверке управляющих точек общего ребра и друг другу. Отношения длин коллинеарных отрезков должны быть постоянными. Куски в форме В-сплайнов представляются в виде: x(s, t) = S Ms Psx MsT TT.= S Ms P11x P 21x P31x P 41x P12 x P 22 x P32 x P13x P 23x P33x P 42 x P 43x P14 x P 24 x M P34 x P 44 x s T TT. Шестнадцать управляющих точек задают кусок поверхности, находящийся около четырех центральных точек Р22, Р23, Р32 и Р33. 7.5. Преобразования параметрических кривых и кусков поверхностей Для выполнения аффинных преобразований с параметрическими кривыми или поверхностями не обязательно применять матрицу преобразования к каждой точке кривой (поверхности). Достаточно перемножить матрицу аффинного преобразования и геометрическую матрицу управляющих точек и касательных векторов (Gh, Gb, Gs, Qh, Pb, Ps). Для выполнения перемножения матриц каждая управляющая точка и касательный вектор записываются в однородных координатах (к координатам точки добавляется четвертая координата, равная единице, а к координатам вектора – равная нулю) [11, 14]. 7.6. Визуализация трехмерных объектов Трехмерный объект может быть изображен разными способами. Способы визуализации можно достаточно условно разделить на несколько уровней по нарастанию сложности [10]: каркасный – рисуются все вершины и ребра объекта – хорошо показывает внутреннюю структуру объекта, но дает самое нереалистичное изображение; с удалением невидимых вершин и ребер; удаление невидимых граней объекта + различные виды закраски видимых граней (однотонная, с учетом освещения, с имитацией плавных переходов между гранями). 7.7. Методы удаления скрытых линий и поверхностей Существуют различные алгоритмы, позволяющие удалять и не выводить как отдельные ребра объектов, скрытые видимыми поверхностями, так и невидимые грани [10, 14, 17]. Все методы удаления невидимых ребер и граней можно разделить на два класса: методы, работающие непосредственно в пространстве самих объектов; методы, работающие в пространстве картинной плоскости. Получаемый результат в первом случае представляет собой набор видимых отрезков или поверхностей, т.е. имеет непрерывный вид, а во втором случае – информацию о ближайшем объекте для каждого пикселя экрана, т.е. имеет дискретный вид. Непрерывные методы, как правило, достаточно сложные. Дискретные методы более просты, но они определяют видимость только в некотором наборе точек растровой решетки. Изменение разрешения растра приводит к необходимости пересчета всего изображения. Для уменьшения времени расчетов используют когерентность различных видов: когерентность в картинной плоскости – если данный пиксель соответствует точке некоторой грани, то, скорее всего, соседние пиксели также соответствуют точкам этой грани; когерентность в пространстве объектов – если данная грань видима, то, скорее всего, и соседние с ней грани видимы; временная когерентность (для анимации) – грани, видимые в данном кадре, скорее всего будут видны и в следующем кадре. 7.7.1. Методы оптимизации Методы оптимизации широко используются для уменьшения затрат времени на удаление невидимых линий и поверхностей. Процедура отсечения нелицевых граней позволяет заранее исключить из рассмотрения грани, повернутые от наблюдателя и заведомо невидимые. Вычисляется угол между внешней нормалью к грани и направлением на наблюдателя. Если этот угол тупой, то грань – нелицевая. При выполнении различных операций по выявлению перекрывающих друг друга граней широко используют ограничивающие грань тела (оболочки). В качестве оболочек чаще всего используют параллелепипеды с гранями, параллельными координатным плоскостям. Если такой ограничивающий грань параллелепипед задан координатами своих диагональных углов (xmin, ymin, zmin) и (xmax, ymax, zmax), то проверка пересечения оболочек двух граней сводится к простой процедуре проверки пересечения трех промежутков: от xmin до xmax, от ymin до ymax и от zmin до zmax. Если хотя бы один из этих промежутков не пересекается с аналогичным промежутком для оболочки другой грани, то оболочки граней не пересекаются и, следовательно, грани тоже не пересекаются. Грани, оболочки которых пересекаются, могут как пересекаться, так и не пересекаться, и в этом случае проводят более сложные вычисления. В компьютерной графике часто встречается задача визуализации внутренних помещений архитектурных сооружений (комнат, коридоров, лабиринтов). Данная задача имеет свою специфику – при очень большом общем числе граней количество граней, видимых из данной точки, сравнительно невелико. При решении данной задачи применяются специальные методы оптимизации, позволяющие как можно раньше отбросить заведомо невидимые грани. Обычно сцену заранее разбивают на набор областей и для каждой области составляют список потенциально видимых граней (PVS – Potentially Visible Set). Один из методов, позволяющих построить PVS – метод порталов. В начале сцена разбивается на набор выпуклых областей. Все грани внутри области могут быть видны, следовательно, они автоматически заносятся в PVS для этой области. Рассматриваются соседние области, соединенные с текущей порталами. Порталами называются те соединения, через которые можно видеть (окна, двери и т.п.). В соседних областях определяются грани, которые могут быть видны из текущей области через порталы. Эти грани заносятся в PVS для текущей области. На следующем этапе рассматриваются области, соединенные с соседними с текущей областями через порталы, в этих областях определяются грани, которые могут быть видны из текущей области (но уже через два портала), и т.д. 7.7.2. Метод сортировки граней по глубине Визуализация граней проводится в порядке от самых дальних от наблюдателя к самым близким. Ближайшие многоугольники преобразуются в растр последними и закрывают более отдаленные многоугольники, т.к. записываются в буфер регенерации поверх старых. При выполнении метода могут возникать неопределенности при перекрытии z-оболочек некоторых граней. Существуют различные модификации метода, позволяющие решать эту проблему. 7.7.3. Метод плавающего горизонта Используется при построении графика функции двух переменных z=f(x,y) в виде сетки координатных линий x=const, y=const. Грани выводятся в порядке от самых ближайших к самым дальним от наблюдателя. Все линии z=f(x, yi), где yi=const лежат в параллельных плоскостях и, следовательно, не пересекаются. Допустим, что координатные оси сориентированы так, что при yi>yi-1 плоскость y=yi расположена ближе к наблюдателю, и значения у меняются от у0 до уn. На первом шаге рисуются ближайшие к наблюдателю грани (уi= уn). Выведенные на первом шаге грани видимы (они самые ближние и их ничего не заслоняет) и образуют так называемый горизонт. На следующих шагах рисуются только те части линий z=f(x, yi), которые не закрываются ранее нарисованными, т.е. лежат выше верхнего или ниже нижнего горизонтов. Нижняя линия горизонта в любой из точек равна минимуму из уже выведенных линий, а верхняя линия горизонта – максимуму. Каждая новая грань поднимает верхний и опускает нижний горизонты. 7.7.4. Метод z-буфера Этот метод работает в пространстве картинной плоскости. Используется дополнительный массив (буфер) в памяти, в котором сохраняются координаты z (глубины) для каждого пикселя растра. Значение z отвечает за расстояние от объекта до наблюдателя (но не обязательно равно ему). Предположим, что ближе к наблюдателю располагаются объекты с наибольшими значениями z. Тогда метод z-буфера будет действовать так. На первом этапе z-буфер будет заполнен минимальными значениями z, а буфер регенерации будет заполнен соответствующими значениями пикселей фона. На следующих этапах производится вывод объектов (в любом порядке). Для каждого пикселя каждого выводимого объекта рассматривается значение z. Если рассматриваемое значение z больше, чем значение, хранимое для данного пикселя в z-буфере, то данный пиксель заносится в буфер регенерации (рисуется), а его значение z заносится в z-буфер поверх старого. После рассмотрения всех объектов буфер регенерации изображения будет состоять из пикселей, соответствующих точкам объектов с наибольшими значениями z (т.е. ближайших к наблюдателю). Данный метод прост и эффективен, не требует предварительной сортировки граней. 7.8. Закрашивание поверхностей После удаления скрытых поверхностей для повышения реалистичности изображения все видимые грани объектов необходимо закрасить. Существуют различные модели закрашивания поверхностей, которые учитывают расположение источников света, характеристики материала поверхности, взаимное расположение граней. 7.8.1. Модели отражения и преломления света В компьютерной графике рассматриваются объекты, которые по отношению к свету обладают следующими свойствами: излучают свет; отражают и поглощают свет; пропускают свет сквозь себя. Каждое из этих свойств можно описать некоторым набором характеристик. Излучение можно охарактеризовать интенсивностью, спектральным составом (цветом), геометрическими размерами источника (точечный, протяженный и т.п.), направленностью излучения (во все стороны, вдоль узкого луча, конусом). Отражение света может быть нескольких видов – зеркальное, диффузное, обратное [10]. Зеркальное отражение (рис. 7.2, а) – падающий на поверхность луч (l) и отраженный луч (s) лежат в одной плоскости, причем угол падения светового луча равен углу отражения. Цвет отраженного луча совпадает с цветом падающего луча, т.е. собственного цвета у зеркальной поверхности нет. Наблюдатель будет видеть отраженный луч только если угол между направлением отраженного луча (s) и направлением на наблюдателя (v) равен нулю (рис. 7., а). Не идеальное зеркальное отражение происходит при падении света на слегка шероховатую поверхность (рис. 7.2, б). В этом случае возникает несколько отраженных лучей, рассеиваемых по различным направлениям. Зона рассеивания зависит от качества полировки и, как правило, симметрична относительно направления идеально отраженного луча, а ее форма может быть описана некоторым законом распределения. Одной из простейших моделей распределения, наиболее часто используемой в компьютерной графике, является модель Фонга: Is = I ks cosР, где Is – интенсивность отраженного луча, I – интенсивность падающего луча, ks – коэффициент пропорциональности, р=1…200 – показатель качества полировки поверхности, – угол отклонения от направления идеально отраженного луча. Сильно шероховатым (матовым) поверхностям присуще диффузное отражение, при котором падающий луч равномерно рассеивается во все стороны (рис 7.2, в). Матовая поверхность имеет свой цвет – наблюдаемый цвет матовой поверхности определяется комбинацией собственного цвета поверхности и цвета падающего луча. Интенсивность диффузно отраженного света не зависит от положения наблюдателя. Диффузное отражение описывается законом Ламбера: Id = I kd cos , где Id – интенсивность диффузно отраженного луча, I – интенсивность падающего луча, kd – коэффициент, учитывающий свойства материала поверхности, – угол между нормалью (n) к поверхности и направлением падающего луча (l). а) б) l l n s в) l n s n v Рис. 7.2. Отражение света: а) идеальное зеркальное, б) не идеальное зеркальное, в) диффузное. Существует еще и обратное отражение, при котором максимум интенсивности отраженного света соответствует направлению на источник света. При изображении объектов в компьютерной графике обычно моделируют сумму зеркального и диффузного отражений: Iотр = I (kd cos + ks cosР), где Iотр – интенсивность отраженного луча. При некоторых значениях углов и интенсивность отраженного света будет равна нулю. Однако, в реальных сценах полностью затемненные объекты используют редко, т.к. учитывают освещение отраженным от других объектов светом (фоновую подсветку) с интенсивностью Iа: Iотр = Iа kа + I (kd cos + ks cosР). Можно учесть и то, что энергия от точечного источника света уменьшается пропорционально квадрату расстояния. На практике обычно используют следующую (не совсем точную) формулу: Iотр = Iа kа + I (kd cos + ks cosР) / (R + k), где R – расстояние до источника света, k – константа. При прохождении световых лучей через полупрозрачную среду происходит их преломление. Падающий и преломленные лучи лежат в одной плоскости, причем: 1 sin1 = 2 sin2, где 1 и 2 – показатели преломления двух сред, 1 и 2 – углы падения и преломления светового луча (рис. 7.3.). 1 2 Рис. 7.3. Преломление светового луча на границе двух сред. Показатель преломления зависит не только от материала среды, но и от длины световой волны: чем меньше длина волны (фиолетовые цвета), тем сильнее отклоняется луч. Существует и диффузное преломление, когда преломленный луч рассеивается равномерно во все стороны, но в компьютерной графике оно используется редко из-за трудности расчета. Таким образом, при рассмотрении полупрозрачных материалов необходимо учитывать и отраженный и преломленный свет. 7.8.2. Определение цвета закрашивания Наиболее просто выполняется расчет при закрашивании в градациях серого цвета (для источника белого света и серых объектов). В этом случае вычисленная интенсивность отраженного света будет просто соответствовать яркости. Для цветных объектов, освещаемых цветным источником света, составляются три формулы расчета интенсивности отраженного света – по одной на каждую цветовую компоненту в модели RGB. Цвет источника будет выражаться значениями интенсивности I для каждой цветовой компоненты. Коэффициенты kа и kd выражают собственный цвет поверхности и, следовательно, для одной и той же поверхности будут различны для каждой из компонент. Коэффициент ks будет одинаков для всех цветовых компонент, т.к. цвет зеркально отраженного луча равен цвету источника. 7.8.3. Модели закрашивания Существует несколько моделей закрашивания плоских граней. На закрашивание грани в общем случае влияют направления четырех векторов: нормали к плоскости грани (n), направления на источник света (l), направления идеального зеркального отражения (s) и направления на наблюдателя (v). При переходе от одной точки плоской грани к другой направление вектора n остается постоянным, изменяются только вектора l, s и v. Однако, в случае удаленного источника света и далеко расположенного наблюдателя этими изменениями можно пренебречь. Это свойство используется в самой простой модели плоского закрашивания, когда освещенность одной, произвольной точки грани, принимают за освещенность всей грани, т.е. грань закрашивается равномерно. Недостаток этого метода – резкие переходы цвета между соседними гранями. Резкость цветовых переходов дополнительно увеличивается из-за возникновения т.н. полос Маха, когда светлая грань вблизи ее границы с более темной гранью субъективно воспринимается глазом человека еще светлее, чем она есть на самом деле. На темной грани вблизи ее границы с более светлой гранью, наоборот, создается иллюзия более темной полосы. Для сглаживания полос Маха применяются интерполяционное закрашивание и закрашивание методом Гуро. При интерполяционном закрашивании интенсивность освещенности определяется отдельно для каждой вершины грани. Освещенность вдоль ребер грани интерполируется от значения освещенности в начальной вершине ребра до значения освещенности в конечной вершине. Поверхность грани закрашивается горизонтальными отрезками с изменяющейся интенсивностью освещенности (интенсивность освещенности в начальной и конечной точках каждого отрезка была определена при закраске ребер грани). Метод Гуро похож на метод интерполяционного закрашивания, но значения освещенности в вершинах грани определяются для осредненного значения нормали. Нормаль в вершине получается при усреднении значений нормалей всех сходящихся в этой вершине граней. При k сходящихся в вершине граней и единичной длине векторов нормалей усредненное значение нормали в вершине: n= n1 n2 ... nk k . Закраска методом Гуро позволяет визуально сгладить переходы между гранями, однако в некоторых случаях не удается избежать появления полос Маха. При закрашивании граней методом Фонга также вычисляются усредненные значения нормалей в вершинах, однако при закраске поверхности грани интерполируются не значения освещенности, а значения нормалей в каждой точке, и лишь потом вычисляется освещенность. Расчет затененности объектов в случае точечных источников света аналогичен расчетам при удалении скрытых линий и поверхностей: поверхности, видимые и из точки зрения, и из источника света, освещены; поверхности, видимые из точки зрения, но не видимые от источника света, находятся в тени и на их закраску влияет только рассеянный свет. Расчет закраски объектов в сложно построенных сценах с несколькими источниками освещения выполняется более сложно. Обычно в этом случае используют трассировку лучей или метод анализа излучательности. При выполнении трассировки лучей предполагается, что световой луч в свободном пространстве распространяется вдоль прямой линии. От источников излучения в разных направлениях исходит бесчисленное множество лучей. Некоторые лучи уходят в свободное пространство, а некоторые лучи попадают на объекты. При попадании на прозрачный объект световой луч преломляется, при этом некоторая часть световой энергии поглощается. При попадании на зеркальную поверхность луч изменяет направление (отражается), часть световой энергии при этом также поглощается. Если объект и отражает и поглощает, то световой луч расщепляется. Таким образом, в результате действия на объекты первичных лучей возникают вторичные лучи, которые также могут попадать на объекты. После многократных отражений и преломлений световой некоторая часть световых лучей попадает в точку зрения, т.е. изображение сцены формируется множеством световых лучей [10, 14, 20]. Трассировку лучей обычно выполняют в обратном порядке (обратная трассировка) – от наблюдателя. Трассируется не бесконечное, а конечное множество лучей, исходящих из точки зрения и проходящих через каждый пиксель изображения. Каждый луч проверяется на пересечение с объектами сцены. Когда выясняется, что текущий луч обратной трассировки не пересекает никакого объекта, а уходит в пространство, трассировка для этого луча заканчивается. Для повышения быстродействия метода используются некоторые ограничения, например: источники света могут только излучать свет, но не могут его отражать и преломлять; рассматриваются только точечные источники света; для учета освещенности светом, рассеиваемым другими объектами сцены, вводится фоновая составляющая; для прозрачных объектов не учитывается зависимость коэффициента преломления от длины волны или вообще прозрачность моделируют без преломления луча света; отражение описывается диффузной и зеркальной составляющими; зеркальное отражение, в свою очередь, описывается двумя составляющими: световые блики от источников света и отражение от других объектов; при диффузном отражении игнорируются лучи от зеркально отражающих поверхностей; для завершения трассировки вводят некоторое пороговое значение освещенности или ограничивают число итераций. Метод анализа излучательности используется для тонирования сцен, в которых подавляющее число объектов имеет поверхности с диффузным рассеиванием [20]. Формируется глобальное уравнение энергетического баланса, решение которого позволяет получить цвет каждой матовой поверхности. Закрашиванием объектов можно передать иллюзию глубины пространства или эффект тумана. В природе контуры отдаленных объектов кажутся наблюдателю размытыми, затуманенными. Этот эффект можно смоделировать в процессе закраски объектов [20]. Для этого среда, в которой находятся объекты формируется полупрозрачной. Итоговый цвет объекта С расчитывается по формуле: C = f Co + (1 – f) Cf, где Co – исходный цвет объекта, рассчитанный с учетом его освещенности, Cf – цвет полупрозрачной среды (тумана), f – функция туманности, которая зависит от расстояния между объектом и наблюдателем. Для передачи глубины пространства используют линейную функцию туманности, для создания эффекта тумана – нелинейную (экспоненциальную и т.п.). 7.9. Детализация поверхностей Существуют два типа детализации поверхностей – цветом (наложение проективных текстур) и фактурой (микрорельефом поверхности) [14]. Текстура представляет собой массив растрового узора, который налагается на поверхность трехмерного объекта на этапе тонирования. Узор текстуры задается функцией интенсивности, которая используется либо для модификации цвета основной поверхности, определяемого с учетом освещенности, либо для назначения для основной поверхности цвета только текстуры. Основные трудности возникают при наложении плоской текстуры на трехмерные кривые поверхности объектов (например, на шар). Текстуры обладают теми же недостатками, что и все растровые изображения – для их хранения может потребоваться большой объем памяти. Для экономии памяти обычно применяют блочное текстурирование: текстура представляет собой не всю грань целиком, а лишь отдельный фрагмент, который циклически повторяется в грани. По возможности текстуры хранят в градациях, а для получения цветного узора их накладывают на тонированную поверхность объекта. В качестве текстур могут использоваться не только простые узоры, но и сложные рисунки. Например, для имитации зеркально отражающей поверхности на объект налагают текстуру, представляющую собой рисунок с изображением отражающихся предметов. Результат будет не такой реалистичный, как при расчете зеркального отражения (особенно, если отражающиеся объекты или наблюдатель перемещаются в пространстве), но вычислений потребуется значительно меньше. Текстуры могут быть и анимированными (движущимися) [1]. Текстуры можно использовать и для имитации фактуры (микрорельефа) поверхности. Однако, если положение объекта относительно источников света будет изменяться, ненатуральность такого «микрорельефа» будет сразу заметна. Для имитации микрорельефа поверхности зачастую используется технология внесения возмущений в нормаль к поверхности объекта (непосредственно перед тонированием поверхности). Результат применения этого метода будет достаточно реалистичным, хотя непосредственное геометрическое моделирование рельефа поверхности не проводится. Существуют и более сложные способы непосредственного моделирования рельефа поверхности, например использование фрактальных поверхностей [14]. Фрактал – это объект довольно сложной формы, получающийся в результате выполнения простого итерационного цикла. Фракталы хорошо описывают природные объекты и большинство искусственных [4, 10, 15]. 7.10. Построение трехмерных сцен Сложные трехмерные модели, включающих множество геометрических примитивов, а также объектов другого типа (источников света, камер), влияющих на то, как будут выглядеть геометрические объекты, называют сценами (реже – мирами). Для описания трехмерных моделей используются разные подходы. Неиерархический подход – все примитивы рассматриваются как символы, из которых строится модель. Обычно символы в библиотеке представлены как объекты стандартного размера и ориентации. Например, примитив цилиндр может иметь единичные высоту и радиус основания, ось цилиндра может совпадать с одной из координатных осей, а центр цилиндра – находиться в точке начала координат. Размещение таких примитивов внутри модели будет задаваться комплексом аффинных преобразований. Для изменения геометрических размеров примитивов используется масштабирование, вращением задается ориентация примитивов в пространстве, перемещение центра примитива позволяет установить примитив в нужное место сцены. Описание сцены при таком подходе представляет собой список примитивов с указанием для каждого из них выполняющихся геометрических преобразований. При иерархическом подходе указываются соотношения между компонентами модели. Наглядно эти соотношения можно представить в виде графа, состоящего из узлов и ребер. В узлах графа могут содержаться графические примитивы, свойства материалов объектов, камеры, источники света и т.п. [1, 20]. В качестве графа сцены обычно используются ориентированные ациклические и древовидные графы. Ребра ориентированного графа исходит из одного узла и заходит в другой, но узел не может содержать сам себя. Ациклический граф не может содержать циклов (замкнутых путей), но каждый узел может иметь несколько заходящих и исходящих ребер. Древовидный граф – это ориентированный ациклический граф, в котором в каждый узел, кроме корневого, может заходить только одно ребро.