Смекни!
smekni.com

Построение трехмерной модели вазы (стр. 2 из 3)

Если уравнения плоскостей не заданы, то нормаль к вершине можно определить, усредняя векторные произведения всех ребер, пересекающихся в вершине.

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

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

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

Его координаты сохраняются в структуре соответствующей грани. Кроме того, при каждом повороте сцены векторы нормали нужно пересчитывать.

Координаты вектора нормали в общем виде:

nx = A.y×(B.z - C.z) + B.y×(C.z - A.z) + C.y×(A.z - B.z)

ny = A.z ×(B.x - C.x) + B.z ×(C.x - A.x) + C.z ×(A.x - B.x) (9)

nz = A.x ×(B.y - C.y) + B.x ×(C.y - A.y) + C.x ×(A.y - B.y)

Отсюда невидимость грани определяется следующим образом:

По углу между направлением взгляда и нормалью можно определить повернута грань к нам или от нас. Если направление взгляда совпадает с вектором (0, 0, 1), то косинус угла между векторами равен nz (координата z нормали), и если nz < 0 – грань видна.

2.3 Алгоритм получения изменений формы и движения объекта

Вращение объекта в разные стороны, в том числе и вокруг своей оси осуществляется с помощью изменения координат точки наблюдения (ρ, θ, ψ)

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

1) закрашивание картинкой фона первой поверхности в памяти

2) отрисовка изображения в памяти поверх фона

3) копирование изображения из памяти на экран

4) вычисление новых координат объектов

5) снова п. 1


3. Описание программы

3.1 Обобщенная структурная диаграмма программы

Рисунок 3 - Обобщенная структурная диаграмма программы

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

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

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

Процедура рисования вызывает последовательно блок преобразования координат и процедуру составления полигонов из точек. Затем выполняет рисование полигонов в промежуточном буфере и совмещение результата с буфером отображения.

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

Блок вращения меняет значения углов обзора в соответствии с нажатиями на клавиши позиционирования и вызывает процедуру отрисовки.

3.2 Введенные типы данных и их предназначение

При реализации программы были определены некоторые специализированные типы данных (таблица 1).

Таблица 1 - Типы данных.

Тип Значение Предназначение
T3DPoint record Содержит 3 координаты точки в трехмерном пространстве, координаты точки на экране, номер точки и нормаль к этой точке имеющая три координаты.
TPolygon record Содержит указатели на вершины полигона, то есть содержит переменные типа P3DPoint. нормаль к полигону, номер полигона, цвет и среднюю точку.

3.3 Введенные основные переменные и их предназначение

При реализации программы были определены некоторые переменные (таблица 2).


Таблица 1 - Переменные

Переменная Значение Предназначение
w,v1 array [1.. nPoint] of T3DPoint мировые, видовые координаты вершин
v array [1.. nPoint] of TPoint экранные координаты точек
polygons array [1.. nTPolygon] of TPolygon массив объектов фигуры
teta extended Отвечает за угол поворота относительно оси Y. Имеет фиксированное значение teta:=pi/9.
phi extended Отвечает за угол поворота относительно оси X. Имеет фиксированное значение phi:=pi*4/3.
buf TBitmap Вспомогательная поверхность в ней создается движение сферы
blink_buf TBitmap Вспомогательная поверхность для быстрого закрашивания фоном (хранит в себе фон изображения)
A, B, C, D переменные типа word типа TPolygon (record) Определяют номера вершин четырехугольника в полигоне. Диапазон значений - 0.. nTPolygon
ro real Определяет расстояние от объекта наблюдения до фигуры. Имеет фиксированное значение

3.4 Текстовое описание основных процедур и функций и их блок-схемы

Процедура FormCreate

Задаются углы поворота, радиусы паралеллей, их количество и высота вазы. Вычисляются видовые координаты вершин вазы (пересечения параллелей и меридианов). Рассчитывается количество полигонов. Создаётся фон типа TBitmap, на котором будет рисоваться фигура (рисунок 4).


Процедура FormKeyDown

В этой процедуре отслеживаются нажатые клавиши с последующим выполнений соответствующих команд.

При помощи процедуры KeyDown задается угол поворота объекта. При нажатии клавиш Up, Down, Left, Right объект поворачивается в заданном направлении (рисунок 5).

Рисунок 5 – Блок-схема процедуры FormKeyDown


Процедура Sort

Для каждого полигона высчитывается вектор нормали и приводится к единичной форме; сортировка массива полигонов по минимальным значениям средних координат (рисунок6).

Рисунок 6 – Блок-схема процедуры Sort

Процедура ViewTransformation

В этой процедуре вычисляются видовые и экранные координаты точек, задаются полигоны. В процедуре мировые координаты переводятся в видовые, в свою очередь которые преобразовываются в экранные координаты точек (рисунок7).

Рисунок 7 – Блок-схема процедуры ViewTransformation

Процедура Draw

Поочередная прорисовка полигонов, то есть который грань дальше от нас прорисовывается первой и т.д (рисунок 8).


Рисунок 8 – Блок-схема процедуры Draw

Функция tone

Функция, задающая плоскость цвета.

В зависимости от угла между направлением взгляда и нормалью цвет должен изменяться. Значение координаты nz нормали для видимой грани изменяется в диапазоне [-1, 0), цвет грани задан в виде RGB компонентов. И, следовательно, для получения цвета грани нужно умножить каждую компоненту на абсолютное значение nz. Для получения компонент цвета воспользовались функциями GetRValue, GetGValue, GetBValue.

3.5 Алгоритм взаимодействия процедур

Рисунок 9 – Алгоритм взаимодействия процедур


4. Тестирование программы

Интерфейс программы представляет собой форму, на которой представлена ваза. Форма имеет фон, для лучшего восприятия.

После запуска программы на экране не наблюдается ничего. Для наблюдения эффектов предлагается использовать следующие кнопки клавиатуры: ВНИЗ: Поворот вокруг оси x вниз; ВЛЕВО: Поворот вокруг оси y влево; ВВЕРХ: Поворот вокруг оси x вверх; ВПРАВО: Поворот вокруг оси y вправо.

Вид окна программы представлен на рисунке 10.

При нажатии на клавиши "влево", "вправо", "вверх", "вниз" происходит соответствующее перемещение фигуры.

Рисунок 10 - Вид окна программы

В ходе тестирования программа работала стабильно, не вызывала появления сообщений об ошибках.


Список литературы

1. Порев В.Н. Компьютерная графика – СПб.: БХВ – Петербург, 2002. – 432 с.: ил.

2. Шикин А.В., Боресков А.В. Компьютерная графика. Полигональные модели. – М.: ДИАЛОГ – МИФИ, 2001. – 464с.

3. Л. Аммерал Принципы программирования в машинной графике. Пер. с англ. – М.: "Сол Систем", 1992. – 224 с.: ил.


Приложение

Листинг программы

unitprog;

interface

uses

Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,

Dialogs,StdCtrls,Math;

type

TForm1 = class(TForm)

procedure KeyDown(Sender:TObject;var Key:Word;Shift:TShiftState);

procedure FormCreate(Sender:TObject);

procedure FormPaint(Sender:TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

T3DPoint=record

x,y,z:extended

end;

TPolygon=record

A,B,C,D:word;

clr:TColor;

end;

const

step=30;//количество точек на одной параллели