Создание программы, реализующей алгоритм удаления невидимых линий и поверхностей методом Z-буфера

Автор работы: Пользователь скрыл имя, 20 Октября 2010 в 00:02, Не определен

Описание работы

Курсовой проект

Файлы: 1 файл

отчет.doc

— 152.00 Кб (Скачать файл)

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 2 2 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 2 2 2 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 2 2 2 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 2 2 2 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 2 2 2 2 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 2 2 2 2 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 2 2 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

После обработки треугольника состояние z-буфера таково: 
 

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 5 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 5 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 6 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 6 5 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 11 10 10 10 10 10 6 5 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 12 11 10 10 10 10 10 6 6 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 13 12 11 10 10 10 10 10 7 6 5 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 14 13 12 11 11 10 10 10 10 7 6 5 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 15 14 13 12 12 11 10 10 10 10 7 6 6 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 14 13 13 12 11 10 10 10 10 7 7 6 5 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 12 11 11 10 10 10 8 7 6 5 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 8 7 6 6 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 8 7 7 6 5 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 6 5 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0 0 0 0 0 0 0 

Для примера  рассмотрим пиксел (20, 15). Оценка z в центре этого пиксела дает

z = -[(3), (20.5) + 15.5 - 120]/4 = 43/4 = 10.75. 

Сравнивая его со значением z-буфера в точке (20, 15) после обработки прямоугольника, видим, что треугольник здесь  расположен перед прямоугольником. Поэтому значение буфера кадра в точке (20, 15) заменяется на 2. Поскольку в нашем примере z-буфер состоит лишь из 4 битовых плоскостей, он может содержать числа только в диапазоне от 0 до 15. Поэтому значение z округляется до ближайшего целого числа. В результате в ячейку (20, 15) z-буфера заносится число 11. 

Линия пересечения треугольника с прямоугольником  получается при подстановке z = 10 в  уравнение плоскости, несущей треугольник. Результат таков:

3x + y - 80 = 0. 

Пересечения этой прямой с ребрами треугольника происходят в точках (20, 20) и (22.5, 12.5). Линия пересечения, на которой треугольник становится видимым, хорошо отражена в буфере кадра. 

Алгоритм, использующий z-буфер, можно также  применить для построения сечений  поверхностей. Изменится только оператор сравнения:

z(x, y) > Zбуфер(x, y) and z(x, y) <= Zсечения

где Zсечения  — глубина искомого сечения. Эффект заключается в том, что остаются только такие элементы поверхности, которые лежат на самом сечении  или позади него. 
 

2.2 УДАЛЕНИЕ  НЕВИДИМЫХ ЧАСТЕЙ 
 

Необходимость в этой процедуре возникает, когда, в конце концов, оказывается, что надо нарисовать грань, у которой часть вершин лежит перед камерой, а часть - за камерой. То есть грань, пересекающуюся с экраном. Сама по себе она правильно не нарисуется.  

Поскольку камера видит только то, что перед ней находится, все те точки, для которых z < -dist, рисовать не надо. То есть, каждую грань надо обрезать плоскостью z = -dist. Принципиально различных случаев расположения грани относительно этой плоскости может быть всего четыре; когда перед камерой находятся соответственно 0, 1, 2 или 3 вершины. Первый и последний случаи тривиальны - если перед камерой находится 0 вершин, то грань просто не видна и рисовать ее не надо; если 3 вершины, то грань видна целиком и полностью и ее достаточно просто взять и нарисовать. Рассмотрим оставшиеся два случая.  

Случай  первый, когда перед камерой находится  только одна вершина:  

 

В этом случае перед камерой находится  только треугольник CDE. Его и надо будет нарисовать вместо грани.  

Случай  второй, когда перед камерой находятся  две вершины:  

 

Здесь уже надо будет нарисовать трапецию DABE; она разбивается на два треугольника, DAB и DBE. Их и рисуем вместо грани.  

Координаты  и текстурные координаты для точек  D, E считаются совсем просто: с одной стороны, D лежит на AC, с другой стороны, D.z = -dist. Для точки D как лежащей на AC любая величина t (вместо t подставляем x/y/u/v) считается следующим образом:  

D.t = A.t + (C.t - A.t) * (D.z - A.z) / (C.z - A.z) = A.t + (C.t - A.t) * (-dist - A.z) / (C.z - A.z) 

Все это  сводится в следующий алгоритм отрисовки  грани:  

выясняем, сколько вершин лежит перед камерой; то есть - какой из случаев мы имеем;

ставим  точки A, B, C в соответствие с вершинами (то есть, если вершина v0 находится перед камерой, а вершины v1, v2 - нет, то имеем первый случай, где C = v0, A = v1, B = v2);

считаем, если нужно, координаты D, E;

рисуем (или добавляем в список отрисовки) полученные треугольники.

Осталось  только добавить, что обрезание на самом деле надо проводить не плокостью z = -dist, а плоскостью z = -dist + smallvalue, smallvalue > 0, чтобы избежать проблем при проецировании. 
 
 
 
 
 
 
 
 
 
 

3. АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ

 

Дадим словесное описание алгоритма z-буфера.

Заполнить буфер кадра фоном, а z-буфер памяти — числом zmin.

Преобразовать многогранник в растровую форму:

ax + by + cz + d = 0 — плоскость.

(x1, y1, z1)

(x2, y2, z2)

...

(xn, yn, zn)

a = S(yi - yi+1) * (zi + zi+1)

b = S(zi - zi+1) * (xi + xi+1)

c = S(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)Dx, но Dx = 1, поэтому

z1 = z - (a/c), где z1 — новая координата, а  z — старая координата.

Вычислить для каждой точки (x, y) многоугольника значение z(x, y) — глубины нахождения в прямоугольнике.

Сравнить  полученное z с соответствующим zбуфера, полученным по координатам в буфере.

Если  вычисленное z меньше zбуфера, то изображение  помещаем в буфер кадра, а zбуфера присваиваем z. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

4. Список функций процедур программы.

 

    procedure StartMainAlgoritmClick(Sender: TObject);

    Главная процедура. Удаляет невидимые линии  методм z-буфера. 

    procedure FormCreate(Sender: TObject);

    Процедура инициализации формы. 

    procedure StepBtnClick(Sender: TObject);

    Добавляет фигуру к сцене. 

    procedure ResetBtnClick(Sender: TObject);

    Очищает экран. 

    procedure ExitBtnClick(Sender: TObject);

    Выход из приложения 

    procedure InitZbuffer;

    Создаёт z-буфер. 

    procedure InitScreenBuffer;

    Создаёт пустой буфер экрана. 

    procedure DrawScreenBuffer;

    Выводит на экран содержимое буфера. 

    function  InitFigure:TFigures;

    Возвращает  случайную фигуру. 

    procedure MainAlgoritm(fig:TFigures); 

    Процедура реализующая метод z-буфера. 
 
 
 
 
 
 
 
 
 

5. ОПИСАНИЕ ПРОГРАММЫ

 

    5.1. Системные требования. 

    Для нормальной работы программы необходимо: 

    Процессор   Intel 8086/88 или любые более поздние модели

    Операционная  система Windows

    Монитор   любой цветной 
 

    5.2. Руководство пользователя 

    Навигации по программе осуществляется с помощью  панели управления, имеющей простой и понятный интерфейс: 

Информация о работе Создание программы, реализующей алгоритм удаления невидимых линий и поверхностей методом Z-буфера