Какими мы видим предметы в разных зонах?

Покажем на примере куба, как выглядит предмет в различных зонах.

 

Линейная перспектива (боле 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.