Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KG / КГ_5глава.doc
Скачиваний:
125
Добавлен:
26.05.2014
Размер:
542.72 Кб
Скачать

5.2. Цилиндр

Здесь мы будем использовать формулы параметрического описания поверхности цилиндра. В одной из возможных разно­видностей такого описания применяются следующие параметры — долгота (l) и вы­сота (h).

где l = 0...360°, h =-0.5... 0.5. ВеличинамиR и Н обозначим соответст­венно радиус и общую высоту цилиндра (рис. 5.28). Рис. 5.28. Цилиндр

Каркасное изображение

Построение каркасного изображения полностью аналогично рассмотренному выше способу для шара. Для цилиндра также рисуются меридианы (здесь это вертикальные линии) и параллели (эллипсы). На рис. 5.29 изображен каркас из прямых линий — ребер вписанного многогранника.

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

Рис. 5.29. Каркас

Удаление невидимых точек

На рис. 5.30 показано изображение цилиндра в двух вариантах— с верхней крышкой и без.

Рис. 5.30. Показ с удалением невидимых точек

В обоих случаях для создания иллюзии объемности здесь выделены черным цветом видимые ребра аппроксимирующего многогранника. Для показа по­верхности многогранника с крышкой достаточно показать ребра граней пе­редней стороны и крышку. Задние грани являются невидимыми (рис. 5.31).

Если верхняя крышка отсутствует, то видимыми являются все грани. В этом случае следует рисовать объект, начиная с самых дальних граней задней сто­роны.

Грани можно выводить попарно, начиная с грани, соответствующей самой дальней точки, как показано на рис. 5.32.

Рис. 5.31. Расположение задних граней. Рис. 5.32. Порядок

вывода граней

Долгота дальней точки определяется расположением камеры:

где [... ] — целая часть

Такой метод сортировки граней можно использо­вать не только для цилиндра, но и для достаточно широкого класса поверхностей. На рис. 5.33 пока­зан пример поверхности вращения, изображенной описанным выше методом. Такая поверхность по­добна цилиндру. Единственное отличие здесь со­стоит в том, что боковая поверхность криволиней-Рис 5 33 поверхность на по вертикали, поэтому для аппроксимации че- вращения

тырехугольными гранями следует использовать

двойной цикл - как по долготе (l), так и по высоте (h). Подобные пример мы рассмотрим несколько позже.

Освещенный многогранник

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

В чем суть проблемы? Проблема в выборе направления нормали к грани. В предыдущем разделе мы рассматривали шар, и вы, наверное, заметили, что

итам мы аппроксимировали поверхность многогранником. Однако для шара указанной проблемы не существует, у него всегда видимой является внешняя сторона поверхности. Необходимое направление нормалей для всех граней легко обеспечить соответствующей нумерацией вершин каждой грани. Для цилиндра без крышек нельзя жестко зафиксировать направление векторов (нормали, если предполагается показывать цилиндр с разных ракурсов (на­пример, изменяя углы поворота камеры а и β).

;Для диффузного отражения цвет грани определяется значением косинуса уг­ла между лучом источника света и нормалью к поверхности. Одним из вари­антов решения проблемы является взятие модуля косинуса, если косинус от­рицательный. Это можно делать, когда положение источника света совпадает с положением камеры. На рис. 5.34 показано несколько вариантов задания направления нормалей.

Рис. 5.34. Варианты выбора направления нормалей

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

Рис. 5.35. Аппроксимация боковой поверхности плоскими гранями

Гладкая боковая поверхность

Рассмотрим один из алгоритмов изображения гладкой боковой поверхности цилиндра — рисо­вание вертикальными линиями. На рис. 5.36 по­казаны: вид сверху (ось z мировых координат направлена на нас), полутоновое изображение поверхности в аксонометрической проекции и направление осей мировых координат (х, у, z). Положение камеры здесь задано одним углом β Источник света располагается так же, как и ка­мера. В этом случае цвет пикселов вертикали бо­ковой поверхности определяется коэффициентом отражения

где R — радиусцилиндра. Вдоль любой вертика­ли боковой поверхности цвет пикселов здесь _ _ „_ „

т. Рис. 5.36. Рисование

одинаков. Кроме того, при данном расположении вертикальными линиями источника света имеет место полная симметрия относительно центральной вертикали. Это позво­ляет построить достаточно быстрый алгоритм рисования. Крышки цилиндр можно также рисовать вертикалями, но это уже не принципиально.

h = Н sin p

Определяем цвет крышки (clrO) по значению cos P for (х = 0; x<=R; x++) {

у = корень квадратный из ( R2 - х2 ) к = у / R

Определяем цвет боковой поверхности (clr) в зависимости от к

у ж у COS P

Рисование двух симметричных вертикалей боковой поверхности:

вертикаль от (хс+х, ус+у - h/2) до (хс+х, ус+у + h/2) цветом clr

вертикаль от (хс-х, ус+у - h/2) до (хс-х, ус+у + h/2) цветом clr

Рисование двух вертикалей крышки:

вертикаль от (хс+х, ус-у - h/2) до (хс+х, ус+у - h/2) цветом clrO

вертикаль от (хс-х, ус-у - h/2) до (хс-х, ус+у - h/2) цветом clrO

>

Здесь (хс, ус) — экранные координаты центра цилиндра.

Входе работы этого алгоритма вычисляются координаты точек эллипса для одного квадранта. Вначале определяется координата у для круга, а затем она умножается на коэффициент сжатия эллипса (cosβ). Определение величины cosβ целесообразно вынести за цикл — вычислить ее один раз в начале ра­боты. В теле цикла нужно вычислять квадратный корень и выполнять не­сколько операций умножения и деления. Хотя эти операции являются мед­ленными, но они выполняются сразу для нескольких пикселов, расположен­ных по симметричным вертикалям. Чем длиннее вертикали, тем меньшую часть от общего времени вывода составляют такие операции (поэтому не обязательно для вычисления точек эллипса использовать алгоритм Брезенхэма — хотя почему бы и нет?). Поскольку собственно вертикаль рисуется дос­таточно быстро, то данный алгоритм может успешно конкурировать по бы­стродействию с алгоритмами полигонального вывода. Еще одно полезное свойство — высокое качество рисования гладкой боковой поверхности. Не­достатком данного алгоритма является показ только вертикального располо­жения цилиндра, в то время как полигональную форму можно свободно по­ворачивать в пространстве.

Следует учитывать, что данный алгоритм можно использовать для углов на­клона камеры β от 0 до 90° (вид сверху). Этим и объясняется рисование толь­ко верхней крышки. Для вида снизу (β от 90 до 180°) необходимо показы­вать нижнюю крышку (верхнюю не нужно, она становится невидимой). Алгоритм легко обобщить.

Если цилиндр является отдельным элементом некоторой сложной сцены, то при выводе, например, с использованием Z-буфера необ­ходимо соответствующим образом построить цикл вывода вертикалей.

Теперь рассмотрим произвольное располо­жение источника света. Как и прежде, будем рассматривать только один точечный источ­ник, расположенный в бесконечности. Пусть расположение источника описывается двумя углами наклона с и βс). Положение каме­ры будем задавать двумя углами наклона — и β). Для простоты вначале положим угол поворота камеры а = 0.

На рис. 5.37 изображен цилиндр, освещенный

сбоку. Здесь показана только боковая по- Рис. 5.37. Освещение слева

верхность — без верхней и нижней крышек. Это более сложный вариант по­каза, поскольку нужно рисовать и внутреннюю часть поверхности.

Рассмотрим четыре точки, расположенные симметрично на поверхности ци­линдра. Для первой точки угол между нормалью к боковой поверхности и лучом от источника света составляет φ1= φ - ас. Для второй точки анало­гичный угол равен φ 2 = φ - ас. Поскольку точки 3 и 4 показываются с внут­ренней стороны поверхности, то их нормали совпадают по направлению с нормалями соответственно в точках 1 и 2. Поэтому φ 3 = φ 1 и φ 4 = φ 2.

Изображаемая форма цилиндра не зависит от угла поворота камеры а. Этот угол обуславливает лишь закрашивание боковой поверхности (наряду с уг­лами расположения1 источника света). Учесть угол а можно, если вычесть его из угла поворота источника света. Рассмотрим алгоритм графического вывода.

Находим коэффициент отражения ki = cos <pi sin pe

если ki < 0, то ki = О

Находим коэффициент отражения кг = cos фг sin pc

если кг < 0, то кг = О

Находим цвета clrl и clr2, соответствующие ki и кг

Рисование двух симметричных вертикалей задней стороны:

вертикаль от (хс+х, ус-у - h/2) до (хс+х, ус-у + h/2) цветом clr2 вертикаль от (хс-х, ус-у - h/2) до (хс-х, ус-у + h/2) цветом clrl

Рисование двух симметричных вертикалей передней стороны:

вертикаль от (хс+х, ус+у - h/2) до (хс+х, ус+у + Ь/2) цветом clrl вертикаль от (хс-х, ус+у - h/2) до (хс-х, ус+у + h/2) цветом clr2 }

Здесь для упрощения записи алгоритма использована идеальная диффузная модель отражения света. Вначале определяются коэффициенты ki и к2, кото­рые затем можно использовать для вычисления цвета, например, в виде ком­понент R, G, В:

где Ru, Gu и Вu — компоненты описания цвета поверхности цилиндра.

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

Данный алгоритм сложнее предыдущего. Здесь в теле цикла выполняется значительное количество медленных операций— кроме корня квадратного вычисляется также и арксинус. Это является недостатком алгоритма с пози­ций быстродействия. Положительной чертой алгоритма является вычисление угловой координаты (φ), которую можно использовать для наложения тек­стуры-развертки (карты,).

Наложение текстуры

В некоторой степени, компьютерная графика — это создание иллюзий. Тек­стуры наглядно это демонстрируют (рис. 5.38). Разве бывают кирпичи округ­лой формы? Крайний справа цилиндр "выложен" именно такими кирпичами. При наложении текстуры плоская карта-развертка растрового образца тек­стуры плавно искривляется, следуя гладкой форме боковой поверхности.

Рис. 5.38. Наложение текстур на боковую поверхность цилиндра

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

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

Кроме того, и для текстурированных объектов очень важно соблюдать зако­ны отражения. Если убрать градиентную закраску у четырех цилиндров, изображенных на рис. 5.38, то для первых трех (кроме "кирпичного") почти полностью исчезнет иллюзия объемности.

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

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

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

Рис. 5.39. Наложение текстуры вертикалями

Общий цикл рисования боковой поверхности можно представить себе сле­дующим образом. Вначале определяются координаты текущей вертикали за­крашивания в экранной системе координат. Пусть эти координаты составля­ют (х, у1) - (х, у2). Необходимо также вычислить угловую координату этой вертикали {<р). По значению угла ср определяем координату Х Т в шаблоне тек­стуры

где НоrТех — горизонтальный размер шаблона текстуры. Угол φ измеряется в градусах.

Одна вертикаль закрашивания (х, у1) — (х, у2) соответствует вертикали с ко­ординатами Т, 0) - Т, VertTex - 1) в шаблоне текстуры, где VertTex — раз­мер текстуры по вертикали.

Рисование одной вертикали боковой поверхности можно представить как цикл, в ходе которого последовательно рисуются пикселы с координатами от у1 до у2. Для пиксела в точке (x, у) определяются соответствующие коор­динаты Т, YT) в шаблоне текстуры, причем Х Т нам уже известна, а коорди­ната YT вычисляется по формуле:

Затем в шаблоне текстуры определяется цвет точки Т, YT). После этого вы бранным цветом рисуется пиксел с координатами(x, у) в основном растре. Формулы вычисления координат можно преобразовать к следующему виду:

где А, В, С и D — константы для всех пикселов одной вертикали. Таким об разом, для каждого пиксела вертикали приходится выполнять несколько one раций умножения и сложения. Для ускорения текстурирования можно построить Инкрементный алгоритм.

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

Вариации формы цилиндра

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

величины Н и R — это константы. Рассмотрим примеры поверхностей, когда! радиус R является функцией параметров h и l, то есть R - R(h,l).

Если радиус зависит только от высоты, то есть R = R{h), то это соответствуя поверхности вращения относительно оси z. Задание конкретной функции R{h) для описания какой-либо поверхности напоминает вытачивание цилиндрической заготовки на токарном станке. На рис. 5.40 приведены примеры поверхностей вращения (во всех случаях параметр h изменяется от -0.5 до +0.5).

где R1 и R2 — радиусы нижней и верхней части соответственно. При R2 =0 получаем конус. Очевидно, что при аппроксимации многогранниками конус следует рисовать уже не четырехугольными, а треугольными гранями.

Рис. 5.40. Примеры поверхностей Рис. 5.41. Еще пример поверхности

вращения вращения

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

M

Например:

В данном случае вдоль вертикали располагаются по две грани (dh = 0.5).

В следующих примерах для создания иллюзии гладкой поверхности нужно использовать большее число граней (рис. 5.42, 5.43).

Рис. 5.42. Сетка граней и закрашивание методом Гуро

Рис. 5.43. Еще две поверхности вращения

Следующую группу составляют такие вариации формы цилиндра, когда ра­диус зависит только от долготы, то есть R = R(l). Пример подобной поверх­ности показан на рис. 5.44.

И, наконец, последнюю разновидность вариаций данного типа, согласно на­шей классификации, представляют поверхности R = R(h, l). Пример такой поверхности приведен на рис. 5.45.

Рис. 5.44. Другая разновидность вариаций формы цилиндра

Рис. 5.45. Винтовая поверхность R = R(h, I)

Соседние файлы в папке KG