Методы и алгоритмы трехмерной графики Понятие "трехмерная графика" в настоящее время можно считать наиболее распространенным для обозначения темы, которую мы рассмотрим (в литературе название часто сокращается до "ЗD-графики"). Однако необходимо отметить, что такое название не совсем точно, ибо речь пойдет о создании изображения на плоскости, а не в объеме. Истинно трехмерные способы отображения пока что не достаточно широко распространены. 4.1. Модели описания поверхностей Рассмотрим, как можно представлять форму трехмерных объектов в системах КГ. Для описания формы поверхностей могут использоваться разнообразные методы. Сделаем обзор некоторых из них. Аналитическая модель Аналитической моделью будем называть описание поверхности математическими формулами. В КГ можно использовать много разновидностей такого описания. Например, в виде функции двух аргументов z =f(x, у). Можно использовать уравнение F (х, у, z) = 0. Зачастую используется параметрическая форма описания поверхности. Запишем формулы для трехмерной декартовой системы координат (х, у, z): х =Fx(s, t), y = Fy(s,t), z = Fz(s,t) где s и t — параметры, которые изменяются в определенном диапазоне, а функции Fx, Fy и Fz будут определять форму поверхности. Преимущества параметрического описания — легко описывать поверхности которые отвечают неоднозначным функциям, замкнутые поверхности. Описание можно сделать таким образом, что формула не будет существенно изменяться при поворотах поверхности, масштабировании. В качестве примера рассмотрим аналитическое описание поверхности шара. Сначала как функцию двух аргументов: Затем в виде уравнения: А также в параметрической форме: Для описания сложных поверхностей часто используют сплайны. Сплайн — это специальная функция, более всего пригодная для аппроксимации отдельных фрагментов поверхности. Несколько сплайнов образовывают модель сложной поверхности. Другими словами, сплайн — эта тоже поверхность, но такая, для которой можно достаточно просто вычислять координаты ее точек. Обычно используют кубические сплайны. Почему именно кубические? Потому, что третья степень — наименьшая из степеней, позволяющих описывать любую форму, и при стыковке сплайнов можно обеспечить непрерывную первую производную — такая поверхность будет без изломов в местах стыка. Сплайны часто задают параметрически. Запишем формулу для компо- ненты x(s,t) кубического сплайна в виде многочлена третьей степени параметров s и V. В математической литературе можно ознакомиться со способами определения коэффициентов а1} для сплайнов, которые имеют заданные свойства. Примеры анализа и синтеза сплайнов в матричной форме приведены в [19, 28]. Рассмотрим одну из разновидностей сплайнов — сплайн Безье. Приведем его сначала в обобщенной форме — степени т x п [19]: где р — опорные точки-ориентиры, 0 < s <1, 0 < t <1, С и C — коэф- фициенты бинома Ньютона, они рассчитываются по формуле: Кубический сплайн Безье соответствует значениям т = 3, п = 3. Для его определения необходимо 16 точек-ориентиров Ру (рис. 4.1); коэффициенты С , С равны 1,3,3,1 при = 0,1,2,3. Кубические сплайны Безъе Характеризуя аналитическую модель в целом, можно сказать, что эта модель наиболее пригодна для многих операций анализа поверхностей. С позиций КГ можно указать такие положительные черты модели: легкая процедура расчета координат каждой точки поверхности, нормали; небольшой объем информации для описания достаточно сложных форм. К недостаткам относятся следующие: сложные формулы описания с использованием функций, которые медленно вычисляются на компьютере, снижают скорость выполнения операций отображения; невозможность в большинстве случаев применения данной формы описания непосредственно для построения изображения поверхности. В таких случаях поверхность отображают как многогранник, используя формулы аналитического описания для расчета координат вершин граней в процессе отображения, что уменьшает скорость сравнительно с полигональной моделью описания. Векторная полигональная модель Для описания пространственных объектов здесь используются такие элементы: вершины; отрезки прямых (векторы); полилинии, полигоны; полигональные поверхности (рис. 4.2). Элемент "вершина" (vertex)— главный элемент описания, все другие являются производными. При использовании трехмерной декартовой системы координаты вершин определяются как (х , у , z ). Каждый объект однозначно определяется координатами собственных вершин. Полигон Полигональная поверхность Рис. 4.2. Базовые элементы векторно-полигональной модели Вершина может моделировать отдельный точечный объект, размер которого не имеет значения, а также может использоваться в качестве конечных точек для линейных объектов и полигонов. Двумя вершинами задается вектор. Несколько векторов составляют полилинию. Полилиния может моделировать отдельный линейный объект, толщина которого не учитывается, а также может представлять контур полигона. Полигон моделирует площадный объект. Один полигон может описывать плоскую грань объемного объекта. Несколько граней составляют объемный объект в виде полигональной поверхности— многогранник или незамкнутую поверхность (в литературе часто употребляется название "полигональная сетка"). Векторную полигональную модель можно считать наиболее распространенной в современных системах трехмерной КГ. Ее используют в системах автоматизированного проектирования, в компьютерных играх и тренажерах, в САПР, геоинформационных системах и тому подобное. Обсудим структуры данных, которые используются в векторной полигональной модели. В качестве примера объекта будет куб. Рассмотрим, как можно организовать описание такого объекта в структурах данных. Первый способ. Сохраняем все грани в отдельности (рис. 4.3) Рис. 4.3. Первый способ описания куба Схематично это изобразим на рис. 4.4 Рис. 4.4. Отдельные грани В компьютерной программе такой способ описания объекта можно реализовать разнообразно. Например, для каждой грани открыть в памяти отдельный массив. Можно все грани записывать в один массив-вектор. А можно использовать классы (языком C++) как для описания отдельных граней, так и объектов в целом. Можно создавать структуры, которые объединяют тройки (х, у, z), или сохранять координаты отдельно. В значительной мере это относится уже к компетенции программиста, зависит от его вкуса. Принципиально это мало что изменяет — так или иначе в памяти необходимо сохранять координаты вершин граней плюс некоторую информацию в качестве накладных затрат. Рассчитаем объем памяти, необходимый для описания куба следующим образом: П1 = 6х4хЗхРв, где Рв — разрядность чисел, необходимая для представления координат. Шесть граней здесь описываются 24 вершинами. Такое представление избыточно — каждая вершина записана трижды. Не учитывается то, что у граней есть общие вершины. Второй способ описания. Для такого варианта координаты восьми вершин сохраняются без повторов. Вершины пронумерованы (рис. 4.5), а каждая грань дается в виде списка индексов вершин (указателей на вершины). Рис. 4.5. Номера вершин Рис. 4.6. В массивах граней сохраняются индексы вершин Оценим затраты памяти: где Рв — разрядность координат вершин, Риндекс — разрядность индексов. Третий способ описания (рис. 4.7). Этот способ (в литературе его иногда называют линейно-узловой моделью) основывается на иерархии: вершиныребра-грани. Оценим затраты памяти: где Рв — разрядность координат, Р и Р — разрядность индексов вершин и ребер соответственно Рис. 4.7. Линейно-узловая модель Для сравнения объемов памяти этих трех вариантов необходимо определиться с разрядностью данных. Предположим, что разрядность координат и индексов составляет четыре байта. Это соответствует, например, типу чисел с плавающей точкой float для координат и целому типу long для индексов (названия этих типов на компьютерном языке С, C++). Тогда затраты памяти в байтах составляют: Пусть для координат отведено 8 байтов (тип с плавающей точкой double), a для индексов — 4 байта. Тогда: Когда разрядность для координат больше, чем для индексов, то ощутимо преимущество второго и третьего вариантов. Наиболее экономичным можно считать второй вариант. Необходимо заметить, что такой вывод мы сделали для куба. Для других типов объектов соотношение вариантов может быть иным. Кроме того, необходимо учитывать такие варианты построения структур данных: использован ли единый массив для всех объектов, или же для каждого объекта предназначен отдельный массив (при объектно-ориентированном стиле программирования каждый объект можно сохранять в отдельном классе). Это может обуславливать разную необходимую разрядность для индексов. А теперь сравним эти три разновидности векторной полигональной модели учитывая другие аспекты. Скорость вывода полигонов. Если для полигонов необходимо рисовать линию контура и точки заполнения, то первый и второй варианты близки по быстродействию — и контуры, и заполнения рисуются одинаково. Отличия в том, что для второго варианта сначала надо выбирать индекс вершины, что замедляет процесс вывода. В обоих случаях для смежных граней повторно рисуется общая часть контура. Для третьего варианта можно предусмотреть более совершенный способ рисования контура— каждая линия будет рисоваться только один раз, если в массивах описания ребер предусмотреть бит, означающий, что это ребро уже нарисовано. Это обуславливает преимущества третьего варианта по быстродействию. Блокирование повторного рисования линий контуров смежных граней позволяет решить также проблему искажения стиля линий, если линии контуров не сплошные, а, например, пунктирные. Топологический аспект. Представим, что имеется несколько смежных граней. Что будет, если изменить координаты одной вершины в структурах данных? Результат приведен на рис. 4.8. Рис. 4.8. Результат изменения координат одной вершины Поскольку для второго и третьего вариантов каждая вершина сохраняется в одном экземпляре, то изменение ее координат автоматически приводит к изменению всех граней, в описании которых сохраняется индекс этой вершины. Это полезно, например, в геоинформационных системах при описании соседних земельных участков или других смежных объектов. Следует заметить, что подобного результата можно достичь и при структуре данных, соответствующей первому варианту. Можно предусмотреть поиск других вершин, координаты которых совпадают с координатами точки А. Иначе говоря, поддержка такой операции может быть обеспечена как структурами данных, так и алгоритмически. Однако когда нужно разъединить смежные грани, то для второго и третьего вариантов это сложнее, чем для первого — необходимо записать в массивы новую вершину, новые ребра и определить индексы в массивах граней. При разработке новой графической системы обычно приходится решать такой вопрос: какие операции реализовывать только алгоритмически, а какие обеспечивать структурами данных? Ответ на это можно дать, проанализировав много других факторов. Здесь мы рассмотрели только малую часть из них. Положительные черты векторной полигональной модели: - удобство масштабирования объектов. При увеличении или уменьшении объекты выглядят более качественно, чем при растровых моделях описания. Диапазон масштабирования определяется точностью аппроксимации и разрядностью чисел для представления координат вершин; - небольшой объем данных для описания простых поверхностей, которые адекватно аппроксимируются плоскими гранями; - необходимость вычислять только координаты вершин при преобразованиях систем координат или перемещении объектов; - аппаратная поддержка многих операций в современных графических видеосистемах, которая обуславливает достаточную скорость для анимации. Недостатки полигональной модели: - сложные алгоритмы визуализации для создания реалистичных изображений; сложные алгоритмы выполнения топологических операций, таких, например, как разрезы; - аппроксимация плоскими гранями приводит к погрешности моделирования. При моделировании поверхностей, которые имеют сложную фрактальную форму, обычно невозможно увеличивать количество граней из-за ограничений по быстродействию и объему памяти компьютера. Воксельная модель Воксельная модель — это трехмерный растр. Подобно тому, как пикселы располагаются на плоскости 2D-изображения, так и вокселы образовывают трехмерные объекты в определенном объеме (рис. 4.9). Воксел — это элемент объема (voxel — volume element). Как мы знаем, каждый пиксел должен иметь свой цвет. Каждый воксел также имеет свой цвет, а, кроме того, прозрачность. Полная прозрачность воксела означает пустоту соответствующей точки объема. При моделировании объема каждый воксел представляет элемент объема определенного размера. Чем больше вокселов в определенном объеме и меньше размер вокселов, тем точнее моделируются трехмерные объекты — увеличивается разрешающая способность. Рис. 4.9. Пикселы и вокселы Для современной КГ воксельный метод считается одним из перспективных. Его используют в компьютерных системах для медицины. Например, при сканировании томографом (computer tomography) получаются изображения срезов объекта, которые потом объединяются в виде объемной модели для дальнейшего анализа [53]. Воксельный метод используется в геологии, сейсмологии, в компьютерных играх [50, 56]. Вокселы также используются для графических устройств отображения, которые создают действительно объемные изображения [37]. Положительные черты воксельной модели: - позволяет достаточно просто описывать сложные объекты и сцены; простая процедура отображения объемных сцен; - простое выполнение топологических операций над отдельными объектами и сценой в целом. Например, просто выполняется показ разреза — для этого соответствующие вокселы можно сделать прозрачными. Недостатки воксельной модели: - большое количество информации, необходимой для представления объемных данных. Например, объем 256x256x256 имеет небольшую разрешающую способность, но требует свыше 16 миллионов вокселов; - значительные затраты способность, точность памяти ограничивают моделирования; разрешающую большое количество вокселов обусловливает малую скорость создания изображений объемных сцен; - как и для любого растра, возникают проблемы при увеличении или уменьшении изображения. Например, при увеличении ухудшается разрешающая способность изображения. Равномерная сетка Эта модель описывает координаты отдельных точек поверхности следующим способом (рис. 4.10). Каждому узлу сетки с индексами (i, j) приписывается значение высоты Zy. Индексам (i, j) отвечают определенные значения координат (х, у). Расстояние между узлами одинаковое— dx по оси х и dy по оси у Рис. 4.10. Узлы равномерной сетки Фактически, такая модель— двумерный массив, растр, матрица, каждый элемент которой сохраняет значение высоты. Не каждая поверхность может быть представлена этой моделью. Если в каждом узле записывается только одно значение высоты, то это означает, что поверхность описывается однозначной функцией z = f (x, y). Иначе говоря, это такая поверхность, которую любая вертикаль пересекает только один раз. Не могут моделироваться также вертикальные грани. Необходимо заметить, что для сетки не обязательно использовать только декартовые координаты. Например, для того чтобы описать поверхность шара однозначной функцией, можно использовать полярные координаты. Равномерная сетка часто используется для описания рельефа земной поверхности. Рассмотрим, как можно вычислить значения высоты для любой точки внутри границ сетки. Пусть ее координаты равны (х, у). Надо найти соответствую щее значение z. Решением такой задачи является интерполяция значений координат z ближайших узлов (рис. 4.11). - Рис. 4.11. Точка в сетке с координатами (х, у, z) Сначала необходимо вычислить индексы j и i одного из узлов: где ]а[ — целая часть числа а, то есть наибольшее целое, которое не превышает а. Далее используем, например, линейную интерполяцию. Для этого сначала найдем значения z в точках А и В. Из пропорции учитывая, что XJ+I—XJ - dx, получим Аналогично найдем Теперь можно найти нужное значение z, поделив отрезок АВ пропорционально значению у Получим Положительные черты равномерной сетки: - простота описания поверхностей; - возможность быстро узнать высоту любой точки поверхности простой интерполяцией. Недостатки равномерной сетки: - поверхности, которые соответствуют неоднозначной функции высоты в узлах сетки, не могут моделироваться; - для описания сложных поверхностей необходимо большое количество узлов, которое может быть ограничено объемом памяти компьютера; - описание отдельных типов поверхностей может быть сложнее, чем в других моделях. Например, многогранная поверхность требует избыточный объем данных для описания по сравнению с полигональной моделью. Неравномерная сетка. Изолинии Неравномерной сеткой назовем модель описания поверхности в виде множества отдельных точек принадлежащих поверхности. Эти точки могут быть получены, например, в результате измерений поверхности какогонибудь объекта с помощью определенного оборудования. Такую модель можно считать обобщением для некоторых рассмотренных нами моделей. Например, векторная полигональная модель и равномерная сетка могут считаться разновидностями неравномерной сетки. Эти разновидности мы рассмотрели в отдельности, так как они играют важную роль для решения задач КГ. А вообще, может существовать много вариантов классификации способов описания поверхностей. Следует учитывать определенную условность нашего перечня моделей поверхностей, последовательность перечисления таких моделей может быть и другой. Рассмотрим модель поверхности в виде множества точечных значений, логически никак не связанных между собой. Неравномерность задания опорных точек усложняет определение координат для других точек поверхности, которые не совпадают с опорными точками. Нужны специальные методы пространственной интерполяции. Так, например, можно поставить такую задачу— по известным координатам (х, у) вычислить значения координаты z. Для этого необходимо найти несколько самых близких точек, а потом вычислить искомое значение z, исходя из взаимного расположения этих точек в проекции (х, у). Как мы уже рассмотрели выше, для равномерной сетки это намного проще — поиска фактически нет, мы сразу рассчитываем индексы самых близких опорных точек. Еще одна задача — отобразить поверхность. Эту задачу можно решать несколькими способами, в том числе триангуляцией. Процесс триангуляции можно представить себе так (рис. 4.12)- Сначала находим первые три самые близкие друг другу точки -— и получаем одну плоскую треугольную грань. Потом находим точку, ближайшую к этой грани, и образовываем смежную грань. И так далее, пока не останется ни одной отдельной точки. Это общая схема, в литературе описано много разных способов триангуляции. Довольно часты ссылки на триангуляцию Делоне [48]. Рис. 4.12. Триангуляция неравномерной сетки Описание поверхности треугольными гранями можно уже считать разновидностью векторной полигональной модели. В англоязычной литературе для нее встречается такое название: TIN (Triangulated Irregular Network). После триангуляции получаем полигональную поверхность, отображение которой сделать уже достаточно просто. Рассмотрим еще один из вариантов описания поверхности — изолинии высоты. Любая изолиния состоит из точек, представляющих одно числовое значение какого-то показателя, в данном случае — значение высоты (рис. 4.13, 4.14). Изолинии высоты также можно вообразить себе как контуры разреза поверхности горизонтальными плоскостями (поэтому для изолиний высоты часто применяется название "горизонтали"). Описание поверхности изолиниями высоты часто используется, например, в картографии. По бумажной карте можно с определенной точностью рассчитать высоты в точках местности, углы наклона и прочие параметры рельефа. Необходимо заметить, что описание рельефа земной поверхности изолиниями высоты неправильно представлять как разрезы горизонтальными плоскостями, ибо поверхность Земли не плоская. Если бы Земля была шаром, то изолинии высоты можно было бы трактовать как изолинии радиусов. Однако Земля — это не шар, она имеет намного более сложную форму, названную геоидом. В геодезии и картографии геоид аппроксимируют с определенной точностью разнообразными эллипсоидами. Таким образом, здесь можно говорить об изолиниях некоторых условных высот в специальных системах координат. Конечно, для описания поверхности можно использовать не только изолинии высоты, но и другие изолинии, например х- или y-изолинии. Рис. 4.13. Поверхность задана изолиниями и отметками высоты Рис. 4.14. Та же поверхность в аксонометрической проекции В компьютерных системах изолинии часто описываются векторно — полилиниями. Используются также изолинии в виде сплайновых кривых. Точки, которые составляют изолинии, и отдельные опорные точки располагаются неравномерно. Это усложняет расчет координат точек поверхности. В графических компьютерных системах для выполнения многих операций, и в первую очередь — для показа поверхности, обычно необходимо преобразовывать описание поверхности в другую форму. Преобразование изолиний в полигональную модель также выполняется методами триангуляции (здесь алгоритмы триангуляции сложнее, чем для триангуляции отдельных точек). Для преобразования неравномерной сетки в равномерную используют специальную интерполяцию. Положительные черты неравномерной сетки: использование отдельных опорных точек, наиболее важных для заданной формы поверхности, обуславливает меньший объем информации по сравнению с другими моделями, например, с равномерной сеткой; наглядность показа рельефа поверхности изолиниями на картах, планах. Недостатки: невозможность или сложность выполнения многих операций над поверхностями; сложные алгоритмы преобразования в другие формы описания поверхностей. Преобразование моделей описания поверхности Рассмотрим, как можно выполнить преобразование моделей описания поверхности. Сделаем это на примере преобразования неравномерной сетки в равномерную. Задачу можно сформулировать так: поверхность описана в виде точечных значений, изолиний и площадных изообластей. Необходимо построить равномерную сетку так, чтобы она представляла эту поверхность с определенной точностью. Для решения данной задачи можно использовать алгоритм, предложенный автором этой книги и реализованный в геоинформационной системе ГИС "ОКО" в 1996 году [57]. Сначала рассмотрим аспекты точности алгоритма и ограничения для его использования. Равномерную сетку можно рассматривать как растр. Расстояние между узлами сетки в плоскости (хОу) обуславливает разрешающую способность такого растра и определяет точность моделирования по осям хну. Конечно, чем меньше расстояние между узлами, тем больше точность моделирования, но это ведет к возрастанию количества узлов и соответственно увеличивает размеры растра. Таким образом, мы определили размер растра по горизонтали (c.v) и вертикали (су). Необходимо также учесть дискретность представления чисел в компьютере при хранении в памяти значений в узлах сетки. В современных цифровых компьютерах числа обычно представляются в форматах с разрядностью, кратной 8 (байт). Однобайтовые целые числа дают 256 градаций, двухбайтовые — 65 536 и так далее. Можно также использовать и форматы с плавающей точкой. Выбираем формат чисел для кодирования пикселов растра. Одной из основных особенностей предложенного алгоритма является то, что число 0 для каждого пиксела указывает на неопределенное значение высоты (пустоты до интерполяции). Это означает, что, например, для однобайтовых пикселов высота имеет не 256, а 255 градаций. Дискретность значений высоты = диапазон значений /255.