Автор работы: Пользователь скрыл имя, 20 Октября 2010 в 00:02, Не определен
Курсовой проект
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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) после обработки
Линия пересечения треугольника с прямоугольником получается при подстановке 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. Руководство
пользователя
Навигации
по программе осуществляется с помощью
панели управления, имеющей простой и
понятный интерфейс: