- •2. Построение каркасного изображения
- •2.1. Изображение шара
- •3.2. Перспективная проекция
- •5. Модели закрашивания
- •5.1. Геометрические составляющие для нахождения отраженного света
- •5.2. Вычисления диффузионной составляющей
- •5.3. Зеркальное отражение
- •5.4. Повышение эффективности с помощью «промежуточного вектора».
- •5.5. Фоновые источники и фоновые отражения
- •5.6. Комбинирование компонентов освещения
- •5.7. Добавление цвета
- •6. Растровая развертка многоугольников
- •6.1.Использование списка вершин и когерентности сканирующих строк
- •6.2.Пересечения вершин (особый случай)
- •7. Алгоритм удаления невидимых поверхностей (алгоритм z-буфера)
- •Литература
3.2. Перспективная проекция
Перспективную
проекцию (рис.3.2) сначала рассмотрим
при вертикальном расположении камеры,
когда
.
Такую проекцию можно себе представить
как изображение на стекле, через которое
смотрит наблюдатель, расположенный
сверху в точке
Здесь плоскость проецирования параллельна
плоскости (
).
Исходя из подобия треугольников, запишем
такие пропорции:
Учитывая также координату Z:
В матричной форме преобразования координат можно записать так:
Обратите внимание
на то, что здесь коэффициенты матрицы
зависят от координаты
(в знаменателе дробей). Это означает,
что преобразование координат является
нелинейным (а точнее, дробно-линейным),
оно относится к классу проективных
преобразований.
Теперь рассмотрим общий случай – для произвольных углов наклона камеры ( и ) также как и для параллельной аксонометрической проекции.
Пусть (
)
– координаты для системы координат,
повернутой относительно начальной
системы (
)
на углы
и
.
Тогда:
Запишем преобразования координат перспективной проекции в виде:
Последовательность преобразования координат можно описать так:
Преобразование в целом нелинейное. Его нельзя описать одной матрицей коэффициентов-констант для всех объектов сцены (хотя для преобразования координат можно использовать и матричную форму).
Для такой перспективной проекции плоскость проецирования перпендикулярна лучу, исходящему из центра ( ) = (0,0,0) и наклоненному под углом и . Если камеру отдалять от центра координат, то центральная проекция видоизменяется. Когда камера в бесконечности, центральная проекция вырождается в параллельную проекцию.
Укажем основные свойства перспективного преобразования в центральной проекции:
-- не сохраняется отношение длин и площадей;
--прямые линии изображаются прямыми линиями;
--параллельные прямые изображаются сходящимися в одной точке.
4. Изображение шара в виде многогранника с закрашиванием граней
Теперь нарисуем шар в виде многогранника, аппроксимирующего форму поверхности с заданной точностью. Известно большое число типов многогранников. Сведения о них имеются в многочисленных книгах по геометрии.
Мы будем рассматривать достаточно узкий класс многогранников. Отличительным признаком рассматриваемых многогранников является то, что у них ребра ориентированы вдоль меридианов и параллелей. Такие многогранники будем описывать двумя параметрами - шаг по широте (dB) и шаг по долготе (dL) в градусах. Кроме того, будем считать эти многогранники вписанными изнутри в шар, то есть вершины каждой грани лежат на поверхности шара. Очевидно, что с увеличением количества граней такие многогранники все больше приближаются к шару. Иными словами, чем меньше dB и dL, тем лучше поверхность многогранника аппроксимирует форму поверхности шара.
Некоторые из этих многогранников достаточно интересны по форме, а многогранник с параметрами dB = 90°, dL = 90° называется октаэдром.
Все грани, примыкающие к верхнему и нижнему полюсам, являются треугольными, а остальные грани— четырехугольными. С позиций компьютерной графики это выгодно отличает многогранники рассматриваемого типа от других, например, правильных многогранников, у которых грани могут иметь значительно больше ребер, чем четыре.
Для построения изображения многогранников будем рисовать каждую грань как полигон. Для вывода полигона требуется определить координаты всех его вершин и задать цвет заполнения.
Очевидно, что показ граней одним цветом дает неудовлетворительный результат - полностью теряется форма поверхности трехмерного объекта. Показ ребер (контуров полигонов граней) другим цветом немного улучшает восприятие.
Построим изображение так, чтобы грани были окрашены в соответствии с законами отражения света. Общую схему алгоритма можно изобразить таким образом:
for (B=-90; BOO; B+=dB)
for (L=0; L<360; Ll+=dL)
{
x[0] = R cos В sin L ;
y[0] = R cos В cos L ;
z[0] = R sin В ;
x[l]= R cos(B+dB) sin L ;
y[l]= R cos(B+dB) cos L ;
z[l]= R sin(B+dB); ;
x[2]= R cos(B+dB) sin (L+dL) ;
у [2]= R cos(B+dB) cos (L+dL) ;
z[2]= R sin(B+dB);
x[3] = R cos В sin (L+dL) ;
y[3] = R cos В cos (L+dL) ;
z[3] = R sin В ;
(X[i], Y[i], Z[i]) = Поворот координат (x[i], y[i], z[i]) ;
Определение вектора нормали по (X[i], Y[i], Z[i]) и определение цвета грани, учитывающего ее ориентацию относительно источника света.
Рисование выбранным цветом полигона грани с четырьмя вершинами
(X[i], Y[i], Z[i]);
}
Приведенную тут схему алгоритма не следует воспринимать как программу на языке С, а также сам алгоритм как оптимальный. В частности, здесь много лишних вычислений косинусов и синусов - количество таких операций обязательно нужно уменьшать, поскольку они выполняются в традиционных компьютерах очень медленно. Кроме того, здесь и далее мы будем рисовать все грани четырехугольниками, хотя, лишь незначительно усложнив данную схему, можно предусмотреть и отдельную ветвь для треугольных граней у полюсов.
Для удаления невидимых точек можно использовать Z-буфер, но можно перестроить цикл так, чтобы грани рисовались в таком порядке - начиная с самых дальних и заканчивая ближайшими.
Для определения цвета каждой грани нужно учесть взаимное расположение источника света и нормали грани. Для диффузной и зеркальной моделей отражения, важно определить координаты вектора нормали. Для вычисления координат вектора нормали к грани достаточно определить координаты точки поверхности шара, соответствующей центру грани. Или же можно взять сумму координат вершин грани и разделить на число вершин - это уже приближенный неточный способ.
