Какими мы видим предметы в разных зонах?
Покажем на примере куба, как выглядит предмет в различных зонах.
Линейная перспектива (боле 5 метров, дальняя зона) | |
В аксонометрии (1-5 м) | |
Обратная перспектива (ближе 1 м) |
Приемом "обратная перспектива" впервые стали пользоваться русские иконописцы И. Грек и А. Рублев. И вовсе не случайно то, что это были именно иконописцы.
Как известно, христианство ориентируется прежде всего на духовный, внутренний мир человека. Соответственно, эти установки должны быть каким-то образом воплощены в церковных картинах, иконах, образах, причем так, чтобы проникнуть в самую глубь души человеческой, задеть, взволновать ее. Понятно, что образ или икона всегда находятся на почтительном от человека расстоянии. Но каким-то способом нужно зрительно разместить изображение на иконе настолько близко, насколько возможно - и вот тогда человек почувствует, что образ как бы проникает в него и вместе с этим возникнет ощущение чуда, ощущение того, что образ будто бы живой.
В обратной перспективе изображаются лишь те предметы, которые находятся на расстоянии не более одного метра от наблюдателя. Но что получится, если нарисовать икону в обратной перспективе и разглядывать ее с почтительного расстояния? Выглядящая сначала неестественно, икона, изображенная в обратной перспективе, как бы приближается к наблюдателю, у которого, при длительном рассматривании, создается впечатление, что он стоит почти вплотную к изображению (вот оно, психологическое воздействие обратной перспективы); икона зрительно становится ближе к наблюдателю, образ проникает в сознание человека, тем самым он получает во много раз более сильные впечатления.
Однако есть еще одно объяснение тому, почему древние художники стали использовать законы обратной перспективы в своем творчестве. Взгляните на рис. 20.14a, на котором в аксонометрической проекции изображен табурет. Древние художники рассуждали так: раз это табурет, то каждая его ножка должна опираться на пол, но вместо этого задние ножки в каком-то "неестественном" положении "повисли в воздухе" (рис. 20.14a). "Нужно поставить их на твердую опору!" - рассуждали древние. И ставили, как показано на рис. 20.14b. Теперь табурет был изображен в обратной перспективе, так как при a < b глубина z(a) > z(b).
И в этом есть смысл.
Методы удаления невидимых линий
Метод z-буфера
Это один из простейших алгоритмов удаления невидимых поверхностей. Идея z-буфера является простым обобщением идеи о буфере кадра. Буфер кадра используется для запоминания атрибутов (интенсивности) каждого пиксела в пространстве изображения, z-буфер - это отдельный буфер глубины, используемый для запоминания координаты z или глубины каждого видимого пиксела в пространстве изображения. В процессе работы глубина или значение z каждого нового пиксела, который нужно занести в буфер кадра, сравнивается с глубиной того пиксела, который уже занесен в z-буфер. Если это сравнение показывает, что новый пиксел расположен впереди пиксела, находящегося в буфере кадра, то новый пиксел заносится в этот буфер и, кроме того, производится корректировка z-буфера новым значением z. Если же сравнение дает противоположный результат, то никаких действий не производится. По сути, алгоритм является поиском по х и у наибольшего значения функции z(x, у).
Главное преимущество алгоритма - его простота. Кроме того, этот алгоритм решает задачу об удалении невидимых поверхностей и делает тривиальной визуализацию пересечений сложных поверхностей. Сцены могут быть любой сложности.
Основной недостаток алгоритма - большой объем требуемой памяти.
Дадим словесное описание алгоритма z-буфера.
1. Заполнить буфер кадра фоном, а z-буфер памяти - числом zmin.
2. Преобразовать многогранник в растровую форму:
· ax + by + cz + d = 0 - плоскость.
(x1, y1, z1)
(x2, y2, z2)
...
(xn, yn, zn)
a = Δ(yi - yi+1) * (zi + zi+1)
b = Δ(zi - zi+1) * (xi + xi+1)
c = Δ(xi - xi+1) * (yi + yi+1)
· z = -(ax + by + d)/c.
Выражаем изменение плоскости вдоль одной из осей.
z - z' = -(ax1 + d)/c + (ax + d)/c = a(x - x1)/c
z1 = z - (a/c)Δx, но Δx = 1, поэтому
z1 = z - (a/c), где z1 - новая координата, а z - старая координата.
3. Вычислить для каждой точки (x, y) многоугольника значение z(x, y) - глубины нахождения в прямоугольнике.
4. Сравнить полученное z с соответствующим zбуфера, полученным по координатам в буфере.
Если вычисленное z меньше zбуфера, то изображение помещаем в буфер кадра, а zбуфера присваиваем z.