Программирование в Pascal. Моделирование 3D-объектов

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

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

 

Рисунок 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 графики в настоящее время;

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

выбор оптимальн?/p>