3.3. Алгоритм построения отраженного изображения в зеркале. Для каждого объекта «настоящей» сцены строится его отраженный двойник, который наблюдатель и увидит в зеркале. Объекты, выглядят в зеркале симметрично отраженными относительно плоскости, проведенной через поверхность зеркала. Алгоритм создания плоского отражения состоит из следующих шагов: 3.3.1. Рисуем часть тумбочки которую необходимо отразить, причем отраженный цвет в зеркале будет отличатся от первоначального. Нужно понимать, что при отражении часть световой энергии теряется. Цвет Сотр вычислим по формуле смешивания отражаемого цвета С и цвета зеркала Сз : Сотр = C*Cз То есть отраженный цвет будет смешан с цветом зеркала. См. в приложении А, страница 47 3.3.2. Отражаем полученную сцену, отраженную относительно плоскости зеркального объекта. Плоскость будем описывать с помощью вектора n (нормали) и принадлежащей плоскости точки p0. Если точка p0 принадлежит плоскости, то точка p также принадлежит этой плоскости в том случае, если вектор (p – p0) перпендикулярен вектору нормали плоскости (см. рис. 9) n*(p-p0)=0 (скалярное произведение, в рамках этого радела 3.3.2 * - скалярное произведение, в остальных простое умножение) Рис. 9 При описании конкретной плоскости вектор нормали n и принадлежащая плоскости точка p0 обычно фиксированы, и формула n*(p-p0)=0 записывается в следующем виде: n*p+r=0 где r = –n p0. Если n p + r = 0, то точка p принадлежит плоскости. 1 Еще для построения отражения необходимо определить точку на плоскости, которая ближайшая к какой-нибудь заданной точке (не на плоскости) Пусть у нас есть точка p в трехмерном пространстве и нам необходимо найти точку m, принадлежащую плоскости ( , r) и ближайшую к точке p. Рис. 10 На рис. 10 видим, что m= p + (–k ), где k — это кратчайшее расстояние от точки p до плоскости, которое одновременно является и кратчайшим расстоянием между точками p и m. Так как если вектор нормали плоскости n нормализован, то n p + r является кратчайшим расстоянием от плоскости до точки p. После того как мы задали плоскость p + r = 0 будем строить отражение точки p = (px, py, pz) Вычислим точку p' = (p'x, p'y, p'z) см. рис 11 Рис. 11 Учитывая вышесказанное m = p – k , где k — это кратчайшее расстояние от точки v до плоскости. Следовательно, что отражение точки p’ относительно плоскости * p + r = 0 вычисляется: p’=p-2k = p- 2( *p+r) = p-2(( *p) +r ) 2 В матричном виде будет выглядеть преобразование p в точку p' : См. в приложении А, страница 42 3.3.3. Применяем буфера трафарета, для реализации зеркала При реализации зеркала необходимо, чтобы отражала только полка, а не вся плоскость. Т.е надо решить задачу отсечения. Отсечение - это процедура обнаружения и исключения из дальнейшего анализа тех элементов сцены (линий, поверхностей, объемных фигур), которые не попадают в видимую область. Объект, устанавливающий границы области отсечения, называется отсекателем. Эту задачу можно решить с помощью использования буфера трафарета, поскольку буфер трафарета позволяет блокировать визуализацию для заданных областей. Следовательно, мы можем использовать буфер трафарета чтобы блокировать визуализацию тех частей отражения шкафа, которые находятся вне поверхности зеркала. Итак, очищаем буфер трафарета, заполняя его нулями. Заносим образующие зеркальную полку примитивы только в буфер трафарета. Поскольку мы визуализируем только зеркальную полку, всем пикселям буфера трафарета будет присвоено нулевое значение, за исключением тех пикселей, которые соответствуют изображению зеркальной полки — им будет присвоено значение 1. На рисунке 12 показана идеология данного метода. Т.е пикселям в которых изображается полка соответствует 1. Остальной сцене - соответствует 0. Теперь мы визуализируем отражение шкафа. Необходимо задать такую проверку трафарета, которая будет завершаться успешно, только если в буфере трафарета для данного пикселя записана 1. В результате изображение шкафа будет отображаться только в том случае, если в соответствующем пикселю элементе буфера трафарета записана единица. Поскольку единицы в буфере трафарета записаны только в тех элементах, которые соответствуют пикселям зеркальной полки, отражение шкафа будет показано только в ней. 3 Рис. 12 См. в приложении А, страница 42 Блок-схема алгоритма: 4 3.4. Алгоритм z-buffer В этом алгоритме используются z-координаты для вычисления удаленности точки от наблюдателя при прохождении проецирующих лучей вдоль оси z. Поэтому его и называют zbuffer Алгоритм: перебирает пиксели, которые принадлежат проекции поверхности восстанавливает положение соответствующих точек на самой поверхности записывает в видеопамять цвета, которые являются ближайшими к наблюдателю точек с одинаковыми экранными координатами. При этом в памяти создаются две матрицы: буфер глубины (z-buffer) - хранит параметры удаления точек сцены буфер кадра (f-buffer) - хранящий цвета точек окна вывода Все вычисления ведутся в экранной системе координат. Перед началом обработки полигонов поверхностей всех объектов сцены выполняется инициализация буферов глубины и кадра фоновыми значениями дальности и цвета. Фоном является любая картинка, заполняющая окно вывода в отсутствие объектов, а дальность фона задается числом, большим удаленности самой дальней точки сцены от наблюдателя. Из всех полигонов составляется список. На каждом кадре визуализации очередной полигон выбирается из составленного списка, проецируется на экран, отсекается окном вывода, после чего начинается растеризация (сканирование точек экранной проекции). Обработка пикселей происходит построчно слева направо и сверху вниз. Для каждого пикселя растра pэ =[i j 0] восстанавливается образ точки p =[x y z] по уравнению поверхности, на которой она лежит, что означает проведение из пикселя pэ в направлении сканирующей прямой Hэ и расчет ее пересечения с поверхностью грани. Вид вектора Hэ обусловлен типом наблюдателя: Дальний наблюдатель - фиксированный вектор Hэ=S соответствует заданной параллельной проекции (см рис 13); ближний наблюдатель - в точке S вектор Hэ =S− pэ (см рис 14). Рис 13 5 Рис 14. Далее вычисляется дальность d найденной точки p и сравнивается с состоянием (i, j)-го элемента буфера глубины Z ij. Дальность d вычисляется: ближний наблюдатель, находится в конечно удаленной точке S, глубина точки ci равна расстоянию di = ci −S (см рис. 15) Рис. 15 Наблюдатель удален в бесконечность в направлении вектора S , значит расстояние от S до всех точек тоже бесконечны, а сортировку можно делать по относительным глубинам, 6 которые отсчитываются вдоль оси d , а d направлен навстречу S. см. рисунок 16. Проекция радиус-вектора точки ci на вектор S вычисляется как: Proek = ti*S, где ti- скалярное произведение ci и S/|S|2 В качестве эквивалента глубины, который уменьшаеться с ростом ti , принемаем скалярное произведение di =−ci S . Равноудаленные от наблюдателя точки лежат в параллельных плоскостях, ортогональных вектору S (см. рисунок 16). Рис.16 После того как вычислили расстояние, смотрим: если расстояние меньше, чем значение буфера глубины, то точка p находится к наблюдателю ближе, чем другие ранее обработанные точки (либо фон) с такими же экранными координатами [i j]. Если больше - то наоборот. После этого в Z-буфере сохраняется новое состояние, равное расстоянию d, а в пиксель буфера кадра Fij записывается цветовой код. Поэтому мы увидим лишь самую ближайшую из нескольких точек на одной прямой. В случае, когда на прямой не встретилось ни одной точки, то цвет пикселя останется фоновым. По окончании обработки содержимое буфера кадра F копируется в окно вывода на экране дисплея. 7 Блок-схема алгоритма. 8 3.5. Вращение. При вращении пространственной точки p =[x y z] вокруг оси Y правой системы координат воспользуемся следующими уравнениями: x’ =cos(φy) + zsin(φy), y’ = y, z’ = - xsin(φy)+zсos(φy) Для поворота объекта на заданный угол каждая координата вершина объекта пересчитывается по соответствующей формуле. С помощью данного алгоритма поворачиваем каждую точку(из которых и образуется фигура) на необходимы угол вокруг оси Y. См. в приложении А, страница 49 Блок схема алгоритма: 9 3.6. Сдвиг. Чтобы транслировать объект в трех измерениях, нужно преобразовать все координаты объекта, затем восстановить объект в новом положении. Если объект представлен как набор многоугольных поверхностей, то сдвигается каждая вершина каждой поверхности. Для проведения этой операции нужно умножить на соответствующую матрицу каждую вершину объекта и получить измененные координаты этой вершины То есть точка Р = (x,y,z) трехмерного пространства сдвигается в положение Р' = (x', у', z') путем прибавления расстояний трансляции tx, tу и tz к координатам точки Р: х' = х + tx, у' = у + ty, z' = z + tz Сдвиг точки иллюстрируется на рис.17 Рис. 17 Точки Р и Р' представляются в однородных координатах четырехэлементными векторамистолбцами, а оператор сдвига Т - это матрица 4 на 4. P’=T*P P’=T*P Получим 1ый элемент равен х + tx 2ой элемент равен у + ty 3ий элемент равен z + tz 4ый элемент равен 1 Как нам и требовалось. 10 Блок-схема алгоритма. Данный алгоритм применяется для отрисовки передвижения полки, а также сдвига створок. См. в приложении А, страницы 43,45 11