Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Построение сложных моделей




Используя данную методику можно построить более сложные полигональные модели, состоящие из большего числа граней. Рядом трудностей, с которыми можно столкнуться на данном этапе в условиях выбранной среды программирования может являться отсутствие большей палитры цветов и градиентов для выделения каждой грани выбранным методом, а так же отсутствие нормальных средств работы с динамической памятью среды. К тому же среда MS-DOS накладывает ограничение на размер выделяемого участка памяти. Грань ограничена определенным числом точек, относительно которых строится. Используя большее число граней (а соответственно и точек) возможна организация более сложных объектов, таких как цилиндр. Особенностью цилиндра является его структура. Цилиндр это геометрическое тело, ограниченное цилиндрической поверхностью и двумя параллельными плоскостями, пересекающими её. Построить цилиндр в чистом виде невозможно, так как необходимо неким образом задать координаты боковой поверхности, не имеющей в своем составе граней и являющейся идеально гладкой. Для разрешения данной проблемы цилиндр (его боковую поверхность) при построении разбивают на множество граней.

 

Рисунок 5

 

Чем больше входит в состав боковых граней, тем более округлым и сглаженным будет выглядеть цилиндр (в настоящее время существует множество технологий аппаратного сглаживания объектов). Построить цилиндр можно, так же, внеся координаты в массив. Чтобы не вносить вручную множество данных, можно ввести цикл, согласно которого координаты вершин граней будут расставлены в определенном количестве на основаниях цилиндра. В описанном случае получим количество из 10 шт.:

j:=1 to 10 do[j].y:=50*sin(rad*(40*j));[j].x:=50*cos(rad*(40*j));[j].z:=50;[j+10].y:=50*sin(rad*(40*j));[j+10].x:=50*cos(rad*(40*j));[j+10].z:=-50;;

 

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

i:=1 to 9 do(cyl[0],cyl[i], cyl[i+1],cyl[0], i+7);(cyl[21],cyl[10+i+1], cyl[10+i],cyl[21], i+7);(cyl[10+i],cyl[10+i+1], cyl[i+1],cyl[i], i+7);;

 

При использовании сложных конструкций в первую очередь потребует пересмотра алгоритм проверки граней на видимость со стороны наблюдателя. Существует ряд простых решений для отброса граней кроме построения нормалей. Можно воспользоваться «алгоритмом художника». Заключается он в следующем. Пусть имеется некий набор граней (т.е. сцена), который требуется нарисовать. Производится сортировка граней по удаленности от камеры. Далее выполняется отрисовка всех граней, начиная с самых удаленных. Довольно распространенная характеристика удаленности для грани ABC - это среднее значение z, mid_z = (A.z+B.z+C.z)/3. По существу это весь алгоритм. Просто, и обычно достаточно быстро. Но существует несколько проблем. При некотором расположении граней этот алгоритм вообще не может дать правильного результата вне зависимости от порядка. При некотором расположении граней и использовании среднего значения z как характеристики удаленности алгоритм дает неправильный результат (рис. 6).

 

Рисунок 6

 

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


Рисунок 7

 

В качестве решения может быть использован метод с использованием Z-буфера. Z-буферизация - в компьютерной трёхмерной графике это способ учёта удалённости элемента изображения. Представляет собой один из вариантов решения «проблемы видимости». Он очень эффективен и практически не имеет недостатков, если реализуется аппаратно т.к. достаточно ресурсоемок в программном исполнении. Программно существуют некоторые альтернативы, способные конкурировать с ним: например, двоичное разбиение пространства (BSP), но они также имеют свои достоинства и недостатки. Основной недостаток Z-буферизации состоит в потреблении большого объёма памяти: в работе используется так называемый буфер глубины (Z-буфер). Z-буфер представляет собой двумерный массив, каждый элемент которого соответствует пикселу на экране. Когда видеокарта рисует пиксел, его удалённость просчитывается и записывается в ячейку Z-буфера. Если пикселы двух рисуемых объектов перекрываются, то их значения глубины сравниваются, и рисуется тот, который ближе, а его значение удалённости сохраняется в буфер. Получаемое при этом графическое изображение носит название z-depth карта, представляющая собой полутоновое графическое изображение, каждый пиксель которого может принимать до 256 значений серого. По ним определяется удалённость от зрителя того или иного объекта трехмерной сцены.


Заключение

 

Данный курсовой проект предназначен для демонстрации основных принципов создания систем трехмерного моделирования. Для примера выбрана наиболее часто встречающаяся задача: продемонстрировать на экране вращающееся вокруг произвольной оси тело. При создании проекта учтена возможность использования отдельных его частей в других программах. Как следствие детально обсуждался ряд основных сложностей, возникающих при реализации построения сложных графических объектов. Кроме того, был рассмотрен ряд алгоритмов и путей реализации задач моделирования, полезных не только для демонстрации возможностей трехмерной графики, но и готовых служить основой для других программ, более сложных и совершенных. В результате можно выделить основные контрольные точки проведенной работы:

анализ применения 3D графики в настоящее время;

выяснения механизма построения графических объектов;

выбор оптимального алгоритма для предложенной среды программирования и операционной системы;

реализация программы построения трехмерных объектов с анимацией.

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


Литература

 

1. Зуев Е.А. Программирование на языке TURBO PASCAL 6.0/7.0 М. Веста, Радио и связь, 1993.

2. Александр Фролов, Григорий Фролов Операционная система MS-DOS М.: Диалог-МИФИ, 1991.

.   Эдвард Энджел Интерактивная компьютерная графика. Вводный курс. 2-е изд. Вильямс, 2001.

.   Горнаков С.Г. Программирование компьютерных игр под Windows в XNA Game Studio Express. - М.: ДМК Пресс, 2008.

.   Керниган Б.В., Пайк Р. UNIX - универсальная среда программирования. М.: Финансы и статистика, 1992.


Приложение

Код приложения

компьютерный графика трехмерный проекция

uses crt, graph; {подключение графических модулей}rad: real=0.01745329; {коэффициент преобразования градусов в радианы}{пользовательский тип "трехмерная"}d=record,y,z: real;;: integer; {переменная цикла}:integer;:char;,a2,a3:real;, grMode, grDriver: Integer; {переменные графического драйвера}tet: array[1..4] of d3d =

((x:50;y:80;z:50),

(x:50;y:0;z:80),

(x:100;y:0;z:0),

(x:0;y:0;z:0));cub: array[1..8] of d3d =

((x:-50;y:-50;z:50),

(x:-50;y:50;z:50),

(x:50;y:50;z:50),

(x:50;y:-50;z:50),

(x:-50;y:-50;z:-50),

(x:-50;y:50;z:-50),

(x:50;y:50;z:-50),

(x:50;y:-50;z:-50)

);cyl:array[0..21]of d3d;

{проверка грани на видимость} {a, b, c -координаты грани}TestGran(a, b, c: d3d): boolean;v1, w2, v2, w1, n: real; {внутренние переменные для построения нормали к грани}

{построение нормали}:=a.x-c.x;:=a.y-c.y;:=b.x-c.x;:=b.y-c.y;:=v1*w2-v2*w1; {проверка видимости}n>0 then:=true {грань видна}:=false; {грань не видна};

{процедура рисования граней} {p1, p2, p3 - координаты грани}

{col - цвет грани}DrawGran(p1, p2, p3,p4:d3d; col: byte);: array [1..4] of pointtype; {внутренний тип для заливки грани заданным цветом}TestGran(p1, p2, p3)=false then exit;(1, col); {определение типа заполнения }

{обработка внутренних переменные для заполнения }[1].x:=round(p1.x+320);[1].y:=round(p1.y+240);[2].x:=round(p2.x+320);[2].y:=round(p2.y+240);[3].x:=round(p3.x+320);[3].y:=round(p3.y+240);[4].x:=round(p4.x+320);[4].y:=round(p4.y+240);(zar[1].x=zar[4].x) and (zar[1].y=zar[4].y)fillpoly(3, zar)fillpoly(4, zar); {заполнить грань заданным цветом}(6, 1); {определение типа заполнения };

{процедура рисования вектора }DrawVector;i:integer;figura =1 then(tet[1],tet[2], tet[3],tet[1], 1);(tet[1],tet[3], tet[4],tet[1], 2);(tet[1],tet[4], tet[2],tet[1], 3);(tet[4],tet[3], tet[2],tet[4], 4);;figura =2 then(cub[4],cub[3], cub[2],cub[1], 11);(cub[5],cub[6], cub[7],cub[8], 12);(cub[1],cub[2], cub[6],cub[5], 13);(cub[3],cub[4], cub[8],cub[7], 14);(cub[2],cub[3], cub[7],cub[6], 15);(cub[5],cub[8], cub[4],cub[1], 16);;figura =3 theni:=1 to 9 do(cyl[0],cyl[i], cyl[i+1],cyl[0], i+7);(cyl[21],cyl[10+i+1], cyl[10+i],cyl[21], i+7);(cyl[10+i],cyl[10+i+1], cyl[i+1],cyl[i], i+7);;;;

{процедура поворота точки в трехмерном пространстве}

{xv, yv, zv - углы поворота точки в градусах}

{x, y, z - точка, которую нужно повернуть}rotate(xv,yv,zv:real; var x,y,z:real);Yt,Xt,Zt:real; {временные переменные}

{повернуть по оси y}:=Y*cos((xv*rad))-Z*sin((xv*rad));:=Y*sin((xv*rad))+Z*cos((xv*rad));:=Yt; Z:=Zt;

{повернуть по оси x}:=X*cos((yv*rad))-Z*sin((yv*rad));:=X*sin((yv*rad))+Z*cos((yv*rad));:=Xt; Z:=Zt;

{повернуть по оси z}:=X*cos((zv*rad))-Y*sin((zv*rad));:=X*sin((zv*rad))+Y*cos((zv*rad));:=Xt; Y:=Yt;;RotateAll;j:= 1 to 4 do rotate(a1,a2,a3,tet[j].x,tet[j].y,tet[j].z);j:= 1 to 8 do rotate(a1,a2,a3,cub[j].x, cub[j].y,cub[j].z);j:= 0 to 21 do rotate(a1,a2,a3,cyl[j].x,cyl[j].y,cyl[j].z);;:= Detect; {инициализация графического режима}(grDriver, grMode,'');:= GraphResult;:=1;:=3;:=4;:=1;[0].z:=50;[21].z:=-50;j:=1 to 10 do[j].y:=50*sin(rad*(40*j));[j].x:=50*cos(rad*(40*j));[j].z:=50;[j+10].y:=50*sin(rad*(40*j));[j+10].x:=50*cos(rad*(40*j));[j+10].z:=-50;;ErrCode = grOk then{если инициализация успешна, то}(0); {установка цвета}(1000);;;(4000);;keypressed then:=0; {остановка вращения}:=0;:=0;:=readkey;;codekey of

'w':a1:=4.0;

'a':a2:=4.0;

's':a3:=4.0;

'd':a2:=-4.0;

'1':figura:=1;

'2':figura:=2;

'3':figura:=3;;CodeKey=#27; {выход по нажатию клавиши Esc};.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...