КГ_5глава (1024112), страница 6
Текст из файла (страница 6)
Рис. 5.49. Кольцо i Рис. 5.50. Спираль
Если изменять радиус R пропорционально долготе, т. е. R =R(ω), то получим спираль (рис. 5.50). Здесь больший диапазон изменения долготы: от -360° до +360°, соответствует двум виткам спирали.
Для пружины (рис. 5.51) значения координат х и у такие же, как и для тора, а координата z тора суммируется с приращением, пропорциональным долготе:
; где А: — некоторая константа, определяющая шаг витков спирали по высоте. Долгота здесь изменяется в троекратном круговом диапазоне (соответствующем числу витков).
Если объединить спираль и пружину, то получим коническую спираль (рис. 5.52):
где константа р определяет увеличение большого радиуса пропорционально долготе, а. к — задает шаг витков пружины по высоте.
5.4. Общие замечания
Мы рассмотрели шар, цилиндр и тор, а также их некоторые вариации. Очевидно, что это лишь малая часть всего многообразия трехмерных форм. Тем не менее, можно сделать некоторые обобщения.
Модель описания и способ отображения
Для описания формы поверхности мы использовали аналитическую модель — параметрические формулы
где s и t — параметры, непрерывно изменяющиеся в некотором диапазоне.
В качестве одного из возможных способов построения изображения поверхности мы рассматривали такой способ. В процессе рисования выполняется
цикл
Вычисление нормали к грани (Ро, P1, Р2,Рз) или же при интерполяции методом Гуро или Фонга вычисление нормали в вершинах грани (аналитически — вычислением частных производных в соответствующих точках поверхности либо усреднением нормалей к соседним граням).
Определение цветовых атрибутов закрашивания грани.
}
Вычисление экранных координат вершин Ро, P1, Р2 и Рз
Вывод полигона (Ро, Р1,Р2,Рз)
}
Таким образом, здесь вычисляются координаты узлов сетки с шагом ds и dt, Поверхность изображается в виде четырехугольных граней. Чем меньше шаг сетки, тем больше таких граней и тем лучше соответствие форме гладкой поверхности.
Является ли данный способ отображения поверхности наилучшим? Вряд ли. Здесь каждая точка поверхности вычисляется четырежды, что существенно замедляет процесс, если поверхность описана сложными формулами. Является ли данный способ самым простым? Вероятно. Можно также подчеркнуть его экономичность по затратам памяти, поскольку не нужны массивы для хранения координат граней — координаты вычисляются "на ходу". Но главное, что следует подчеркнуть, — этот способ универсален. Его можно применить для отображения широкого класса поверхностей. Он может использоваться для произвольных поверхностей, для которых известны параметрические формулы, например для сплайнов. На рис. 5.53 и 5.54 показаны несколько вариантов изображения кубического сплайна Безье рассматриваемым способом.
Рис. 5.53. Аппроксимация гладкой поверхности сплайна
Рис. 5.54. Закраска Гуро и наложение текстуры
В компьютерной графике важную роль играет быстродействие вывода. Повысить скорость рисования для рассматриваемого базового алгоритма можно следующим образом. Чтобы избежать повторного вычисления координат вершин граней, вначале следует вычислить узловые координаты всех точек ! поверхности и записать в массив. Затем можно в отдельный массив записать координаты векторов нормалей в вершинах. Потом преобразовать координаты и рисовать полигоны граней. Введение дополнительных массивов для вершин и нормалей обычно заметно увеличивает скорость, например, при закрашивании Гуро, поскольку исключаются повторные расчеты не только координат вершин, но и векторов нормалей к соседним граням. Однако общий характер цикла отображения здесь сохраняется. Когда нужно отобразить требуемый объект, то заново вычисляются все узловые координаты. А теперь представим себе, что некоторая трехмерная сцена содержит несколько таких объектов. Предположим, что многие объекты остаются неподвижными, а изменяется лишь ракурс показа. Зачем тогда всякий раз вычислять мировые (а точнее, некоторые локальные) координаты по параметрическим формулам? Их можно вычислить только один раз при инициализации сцены и записать координаты всех вершин (и нормалей, если необходимо) в массивы. А при расчете кадров производить только все необходимые преобразования координат и закрашивание. Более того, можно параметрические формулы не вычислять вообще, если хранить описание координат вершин (и нормалей) в файлах соответствующего формата, которые загружаются при инициализации сцены. Так мы постепенно перешли от аналитической модели описания объектов к полигональной модели, которая также имеет свои плюсы и минусы.
Модель описания и способ отображения, вообще говоря, не обязательно соответствуют друг другу.
"Квадратирование" и триангуляция
В качестве небольшого околонаучного развлечения давайте попрактикуемся в терминологии. Рассматриваемый здесь способ отображения поверхностей четырехугольными гранями можно назвать "квадратированием". Способ этот] известен давно, а такое название мы с вами можем изобрести и сами. Оно' кажется достаточно звучным и вполне соответствующим сути, а главное —; может помочь застолбить "непоправимый вклад в науку" (последнее выражение в кавычках придумано не мною). А если говорить серьезно, то лучше! все-таки следовать общему правилу — не засорять язык без крайней необходимости. Поэтому используем кавычки.
Применение четырехугольных граней для поверхностей общего вида, вообще говоря, это вопрос спорный. Почему именно четырехугольные грани? Для сравнения на рис. 5.55 и 5.56 приведены два варианта граней — четырехугольники и треугольники.
Рис. 5.55. "Квадратирование" и триангуляция
Рис. 5.56. При небольшом числе граней видны существенные отличия
Здесь необходимо упомянуть следующие понятия. Грань называется плоской, если все ее вершины располагаются в одной плоскости трехмерного пространства. При отображении трехмерного объекта на плоскости пространственные грани (как плоские, так и неплоские) изображаются закрашенными многоугольниками — полигонами. Полигоны бывают выпуклыми и невыпуклыми. Выпуклый полигон — это фигура на плоскости, контур которой пересекается любой прямой линией только дважды. Если находится такая прямая линия, которая пересекает контур большее число раз, то это невыпуклый полигон. Это обуславливает особенности алгоритмов графического вывода. Алгоритмы вывода полигонов мы рассматривали в главе 3.
Очевидно, что любой треугольник всегда выпуклый. Таким образом, треугольная грань в пространстве всегда является плоской и отображается на плоскости выпуклым полигоном. Четырехугольная грань может быть как плоской, так и неплоской. И та и другая четырехугольная грань может отображаться в проекции как выпуклым, так и невыпуклым полигоном. Любой четырехугольник можно изобразить в виде двух треугольников. Некоторые примеры таких полигонов приведены на рис. 5.57.
Рис. 5.57. Изображение четырехугольных граней: а — выпуклый полигон, б — триангуляция, виг — невыпуклые полигоны
Для поверхностей вращения все четырехугольные грани являются плоскими (разумеется, если поверхность аппроксимировать так, как это сделано в предыдущих разделах — по меридианам и параллелям). Если форма — не поверхность вращения, то такие грани могут быть плоскими, а могут таковыми и не быть. Это можно отметить и для некоторых вариаций формы шара, цилиндра и тора, приведенных выше. Зачем нужны именно плоские грани? И когда необходимо применять триангуляцию? Для ответа на эти вопросы нужно учитывать многие аспекты.
Алгоритм отображения может вносить некоторую погрешность — в одних случаях заметную, а в некоторых случаях ею можно пренебречь. Триангуляция в этом плане является более корректной. В то же время, иногда изображение, построенное из треугольных граней, субъективно выглядит существенно хуже, чем при использовании четырехугольников.
С другой стороны, неплоские грани могут значительно затруднить процесс формирования изображения из-за ограничений используемой технологии. В разных графических системах в этом плане имеются существенные отличия. Так, например, при определенном ракурсе показа неплоская четырех-
угольная грань изображается невыпуклым полигоном. Это и приводит к проблемам. Например, в API библиотеки OpenGL в качестве графических примитивов предлагаются только выпуклые полигоны, а в API Windows nof гон-примитив может быть и невыпуклым. Очевидно, что любой невыпуклый полигон может быть разрезан на треугольники (или другие выпуклые фигуры), но это усложняет алгоритм отображения.
Существенную роль играет быстродействие. Например, если в некотор| графической системе два треугольника выводятся быстрее, чем один чец рехугольник, то при прочих равных условиях это может оказаться pemaj щим фактором.
При аппроксимации поверхностей не обязательно использовать постоянщ шаг сетки. -Размеры и ориентация граней могут варьироваться в зависимое! от кривизны участков поверхностей. Это позволяет достичь лучшего coof ношения между точностью аппроксимации и количеством граней.