КГ_5глава (Компьютерная графика), страница 4
Описание файла
Файл "КГ_5глава" внутри архива находится в папке "Компьютерная графика". Документ из архива "Компьютерная графика", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 4 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "компьютерная графика" в общих файлах.
Онлайн просмотр документа "КГ_5глава"
Текст 4 страницы из документа "КГ_5глава"
где Ад, Вд, Сд, Dд, Ед и Fд — величины, которые могут быть функциями от координат хш, уш, zш, широты и долготы. Рассмотрим некоторые примеры (рис. 5.16—5.22).
Рис. 5.16. Эллипсоиды
Рис. 5.17. Наполовину эллипсоид, наполовину — шар
Рис. 5.18. Верхняя часть — вогнутый эллипсоид
Рис. 5.19. Половинки шара разнесены
[.
Рис. 5.20. "Груша"
Рис. 5.21. "Капля"
Рис. 5.22. Это не тор
В рассмотренных выше примерах для деформации формы шара были использованы преобразования координат только по оси z. В нижеследующих примерах выполняются преобразования также и координат*, у (рис. 5.23—5.27).
Рис. 5.23. Сдвиг по х пропорционально квадрату z
Рис. 5.24. Сдвиг по х пропорционально кубу z
1
Рис. 5.25. Сдвиг пропорционален квадрату широты :
Рис. 5.26. Модуляция х, у синусом долготы
Рис. 5.27. "Чеснок"
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 источника света). Учесть угол а можно, если вычесть его из угла поворота источника света. Рассмотрим алгоритм графического вывода.