Для создания приложения были использованы следующие библиотеки:
l OpenGL - для визуализации трехмерных объектов
l FreeGLUT - для создания окон, а также взаимодействия с мышью, клавиатурой и прорисовки геометрических примитивов.
l Windos.Platform - для работы с элементом управления SimpleOpenGLControl, в котором происходит прорисовка всех объектов
В ходе работы были изучены следующие темы:
Источники света в OpenGl. OpenGL дает разработчику более широкие, по отношению к физическому миру, возможности для настройки освещения. Если стоит цель создать как можно более реалистичное изображение, то эти возможности нужно использовать весьма аккуратно. В реальном мире любой источник света имеет спектр, который характеризует, свет в каком диапазоне длин волн излучает этот источник. Точно так же материал по-разному отражает/преломляет/поглощает свет с различной длиной волны. В модели освещения OpenGL все идентично, за той лишь разницей, что можно задавать степень отражения для красной, зеленой и синей компонент составляющих освещенности. В большинстве случаев источники света излучают белый свет различной интенсивности, а результирующий цвет в большей степени определяется свойствами материала. Фоновые компоненты подбираются таким образом, чтобы вклад фоновой освещенности был невелик. Большую часть результирующей освещенности вносит рассеянная составляющая.
Освещение любого объекта зависит от двух факторов. Первый - это материал, из которого сделан объект. Второй - это свет, которым он освещен.
После того, как задана необходимая геометрия (нормали) необходимо разместить на сцене один или несколько источников света, настроить их свойства и включить их. По умолчанию освещение отключено. Включается оно командой glEnable(GL_LIGHTING). В зависимости от реализации OpenGL на сцене могут присутствовать восемь и более источников света. Включить нулевой источник света можно командой:(GL_LIGHT0);
Остальные включаются аналогичным способом, где вместо GL_LIGHT0 указывается GL_LIGHTi. После того, как источник включен, необходимо задать его параметры. В OpenGL существует три типа источников света:
l источник направленного света: расположен в бесконечности и имеет выделенное направление освещения.
l точечный источник света: расположен в конкретной точке пространства и светит равномерно во всех направлениях. Для него можно задать эффект затухания света с расстоянием.
l прожектор: является частным случаем точечного источника, но свет от него распространяется только внутри ограничивающего конуса, а не по всем направлениям.
Для управления свойствами источника света используются команды glLight*:
glLightf(GLenum light, GLenum pname, GLfloat param);(GLenum light, GLenum pname, const GLfloat *param);
Параметр light указывает OpenGL для какого источника света задаются параметры. Команда glLightf используется для задания скалярных параметров, а glLightfv используется для задания векторных характеристик источников света.
Для источника света можно задать фоновую, рассеянную и зеркальную компоненты излучения.
Параметр pname команды glLightfv:_AMBIENT - цвет фонового излучения источника света_DIFFUSE - цвет рассеянного излучения источника света (значение по умолчанию для_LIGHT0 - белый, для остальных - черный)_SPECULAR - цвет зеркального излучения источника света (значение по умолчанию для_LIGHT0 - белый, для остальных - черный)
Параметр pname команды glLightfv:_POSITION - (x, y, z, w) направление
источника направленного света. Первые три компоненты (x, y, z) задают вектор
направления, а компонента w всегда равна нулю.
Направленный источник света
(6)
Т.о. для точечного источника света, кроме свойств излучения, можно задать
ещё четыре параметра:_POSITION - позиция источника света (по умолчанию источник
света направленный)_CONSTANT_ATTENUATION - постоянная k_const в функции
затухания f(d)_LINEAR_ATTENUATION - коэффициент k_linear при линейном члене в функции
затухания f(d)_QUADRATIC_ATTENUATION - коэффициент k_quadratic при квадрате
расстояния в функции затухания f(d)
Точечный источник света, убывание интенсивности с расстоянием выключено
Точечный источник света, убывание интенсивности с расстоянием включено
Прожекторы. Одной из разновидностей точечного источника является
прожектор. Для него применимы все параметры, что и для точечного источника, но
кроме того прожектор позволяет ограничить распространение света конусом. Для
этого конуса можно задать коэффициент убывания интенсивности, в зависимости от
угла между осью конуса и лучом распространения света.

Параметр pname команды glLightfv
_SPOT_DIRECTION - (x, y, z) - направление прожектора (ось ограничивающего
конуса_SPOT_CUTOFF - угол между осью и стороной конуса (он же половина угла при
вершине)_SPOT_EXPONENT- экспонента убывания интенсивности
Прожектор
Прожектор, включен расчет убывания интенсивности для прожектора
В своей работе я использовала направленный источник света для освещения сцены.
Материал. При построение трехмерных объектов я использовала материалы, которые являются частью функции освещения . Для любого объекта на сцене можно определить свойства материала отражать различные компоненты освещения: фоновую, рассеянную и зеркальную. Это можно сделать командой:(GLenum face, GLenum pname, const GLfloat *params);
Параметр face команды glMaterialfv:_FRONT - Свойства задаются для лицевой стороны поверхности._BACK - Свойства задаются для тыльной стороны поверхности._FRONT_AND_BACK - Свойства задаются для обеих сторон поверхности.
Параметр pname задает, какое свойство материала передается через params.
Параметр pname команды glMaterialfv:_AMBIENT - цвет фонового отражения
материала_DIFFUSE - цвет рассеянного отражения материала_SPECULAR - цвет
зеркального отражения материала_EMISSION - цвет собственного излучения материала_SHININESS
- степень в формуле зеркального отражения (коэффициент блеска). Допускаются
значения в интервале._AMBIENT_AND_DIFFUSE - цвет фонового и рассеянного
отражения материаласодержит указатель на массив из четырех чисел
соответствующего типа (или одного для GL_SHININESS). Отсечения здесь не
происходит и в расчете освещенности эти значения участвуют как есть. Для
установки коэффициента блеска можно использовать команду:(GLenum face,
GL_SHININESS, GLfloat shininess);
Так как ПК BRAND является расчетным комплексом, написанным на языке Fortran и сложный геометрический блок, позволяющий делать расчеты для трехмерных геометрических конструкций, собирается фактически вручную в текстовом файле, все конструкции необходимо визуализировать, дать возможность пользователю посмотреть на ту конструкцию, которую он собрал. Построение изображений ведется по той же схеме, что и расчет в ПК BRAND, что позволяет также проверить и правильность считывания исходных данных в программном комплексе, исключая, таким образом, возможные ошибки в геометрической части.
Для того, чтобы достичь единообразия в восприятии входных данных, как в разрабатываемой программе, так и в самом ПК BRAND необходимо разработать библиотеку функций имитирующих работу физической части основной программы и ее геометрического модуля.
Библиотека написана на языке FORTRAN и включает в себя функции, которые дают всю необходимую информацию для визуализации сборки: координаты, материал, размеры областей и зон, список используемых материала и т.д.
Функция vlet написана таким образом, что она моделирует прохождение частицы через материал с запретом соударений в нем (Рис. 4). Таким образом, в результате сквозного пролета одной частицы можно получить следующие данные:
. попала ли частица в хотя бы одну из зон сборки
. если да, то через сколько зон она пролетела
. какие материалы заполняют каждую из зон
. длину следа частицы в каждой из зон.
Так как траектория движения частицы является лучом, то на нем, соответственно, можно отложить те отрезки, которые соответствуют пути через каждую зону. Таким образом, становится известной внутренняя структура сборки. Далее предполагаем, что такие частицы испускаются некоторым источником на плоскости, которая параллельна одной из координатных плоскостей в направлении сборки. Каждый из налетающих объектов обладает определенным размером d и рассматриваем пройденный в материале путь как параллелепипед, для трехмерного режима, и как отрезок, двухмерного режима, с длиной равной длине пути l в данной зоне и шириной и высотой, равными d.
Далее, пользуясь возможностями библиотеки OpenGL, выводятся на экран все
элементы сборки «по кирпичикам» для трехмерного режима и, пользуясь
возможностями библиотеки Draw, выводятся на экран все элементы сборки отрезками
для двухмерного режима.
(Рис. 4 Иллюстрация функции vlet)
Программа SUPER BRAND имеет простой интерфейс, состоящий из нескольких окон
Первое окно представляет собой картинку одной из сборок, с которой работает программный комплекс BRAND, а также кнопкой «Продолжить», которая переводит нас на главное окно, состоящее из панели вкладок и панели икон.
Вкладка «Файл» позволяет открыть файл с геометрическим заданием сборки, с помощью диалогового режима (см. приложение 2), а также выйти из программы. Иконы на панели открывают файл с геометрией, и осуществляет выход из программы.
После открытия файла появляется окно с изображением сборки.
В окне представлены панели вкладок и основных инструментов. Вкладка «Данные» позволяет перейти на апплет «Значения параметров», который позволяет механически задать ось сечения, значение по оси, а также области прорисовки
Вкладка «Материалы» вызывает апплет «Таблица зон», который позволяет пользователю самостоятельно задать цвета для различных материалов
Вкладка «3D графика»
открывает окно с реализованной 3D
отрисовкой, о которой будет рассказано ниже. Иконы на панели выполняют функции
вкладок: «Данные», «Таблица зон», строя проекции перпендикулярно выбранной оси,
увеличивают или уменьшают полученное изображение, задают точку для построения
проекции. В правом нижнем углу представляется информация о координатах точки.
После открытия файла появляется окно с изображением сборки. Для того чтобы изображения было отрисовано необходимо узнать его положение. Для этого запускаются перпендикулярные друг другу лучи с шагом равным 1 пиксель, для нахождение минимальных и максимальных значений фигуры по осям OX, OY и OZ.
void vlet(ref double X, ref double Y, ref double Z, ref double U, ref double V, ref double W,ref int ISTOP, ref int KGEOM, ref double AT)-функция, позволяющая выводить луч, где:
ref double X, ref double Y, ref double Z- передача координат по ссылке, из которых выпускается луч;double U, ref double V, ref double W-передача направления выпускаемого луча;int ISTOP-остановочный элемент, передает значение «0» если на пути луча не был встречен элемент сборки, «1»-был найден элемент сборки;int KGEOM-передает количество зон, встреченных на пути;double AT - содержит расстояние до первой зоны.
Далее осуществляется первая прорисовка в плоскости YOZ (см. приложение 3)
В режиме тестирования были проверены различные функции программы.
1. Проекция параллельно оси OY. Были выбраны точки Y=2,941 Z=-8,824
. Проекция параллельно оси OZ. Были выбраны точки X=-170,588 Y=-2,941
. Масштабирование: уменьшение и увеличение (см приложение 4)
. Задание данных. Выбрали ось сечения-OY, значение по оси=-2,941.
. Таблица материалов. Был выбран материал под номером 2, сменили цвет с оранжевого на синий.
. Прокрутка. Изображение было сдвинуто вправо и вниз
Модификация созданных функций для взаимодействия с программным комплексом BRAND.
Для обеспечения связи с BRAND было создано две библиотеки void vlet и void geom. Это внешние функции, загружаемые из разработанной динамической библиотеки. Они были адоптированны для трехмерной визуализации. Для этого был создан публичный класс.static void Vlet ( ref Luch luch, ref int ISTOP, ref int KGEOM, ref double AT)
{X = luch.position.x;Y = luch.position.y;Z = luch.position.z;U = luch.direction.x;V = luch.direction.y;W = luch.direction.z;(ref X, ref Y, ref Z, ref U, ref V, ref W, ref ISTOP, ref KGEOM, ref AT);= new Luch(new Point3D(X,Y,Z), new Point3D(U,V,W));
}static void Geom(ref int KGEOM,ref Luch luch, ref int KMAX, int[] MS, double[] AMR)
{X = luch.position.x;Y = luch.position.y;Z = luch.position.z;U = luch.direction.x;V = luch.direction.y;W = luch.direction.z;.geom(ref KGEOM, ref X, ref Y, ref Z, ref U, ref V, ref W, ref KMAX, MS, AMR);= new Luch(new Point3D(X, Y, Z), new Point3D(U, V, W));
}int KGEOM- передает количество зон, встреченных на пути;luch - структура, содержащая информацию о координатах и направлении точкиint ISTOP-остановочный элемент, передает значение «0» если на пути луча не был встречен элемент сборки, «1»-был найден элемент сборки;double AT - содержит расстояние до первой зоны.int KMAX-передает общую длину всех зон;[] MS-массив, встреченных зон;[] AMR-массив длин всех зон;
Класс, отвечающий за трехмерную прорисовку.
Чтобы сборка была нарисована, сначала определяются ее границы, далее
формируется массив длин материалов на каждый луч. Выпускаемый нейтронный луч,
как говорилось ранее, представляет собой параллелепипед, разделенный на
различный зоны. Была выбрана плоскость XOZ, из которой выпускаются лучи с шагом
60. Таким образом, объект представляет собой набор параллелепипедов. Конечный
результат - трехмерное изображение сборки на экране компьютера(см. приложение
8). Данная сборка является грубым изображением из-за крупного разбиения
плоскости. Шаг построения фигуры можно задавать вручную в приложении, тем самым
увеличивая или уменьшая точность отрисовки.
1. Изменение шага разбиения для прорисовки сборки.
. Масштабирование изображения (см.приложение 4)
3. Динамическое взаимодействие с фигурой: повороты вдоль осей OX,OY, OZ, смещение вдоль
OX, OY (см приложение 6,7).
. Взаимодействие с нарисованными зонами и материалами: прорисовка
указанных зон или материалов. Просмотр информации по материалу. Т.к. заказчиком
не была представлена общее обозначение материалов, их название и свойство. Было
принято решение обозначать условно: “Material” + №