- •1 Постановка задачи и определение требований
- •Выводы по разделу один
- •2 Обзор существующих реализаций и описание основных преимуществ выбранной реализации перед аналогами
- •1.2.1 Обзор существующих реализаций
- •Выводы по разделу два Таким образом, наилучшем выбором платформы для разработки является Flash.
- •3 Выбор инструментальных средств разработки
- •4.1 Исследование технологий 3d-рендеринга на платформе Adobe Flash
- •5 Архитектура программного комплекса
- •5.1 Алгоритмические особенности программного комплекса
- •5.1.1 Анализ поставленной задачи
- •5.2 Алгоритм функционирования программного комплекса
- •5.2.1 Обобщенный алгоритм работы комплекса
- •5.2.2 Загрузка объектов в 3d-среду
- •5.2.3 Отрисовка 3d-мира
- •5.2.4 Обработка команд пользователя
- •5.2.5 Описание технологий. Binary Space Partitioning (bsp) дерево
- •5.2.6 Отсечение (клиппинг)
- •5.3 Варианты дальнейшего развития программного комплекса
- •5.4. Функциональные особенности программного комплекса
- •5.4.1 Концепция функционирования программного комплекса
- •6.2 Требования к содержимому тестов
- •6.3 Пример работы программного комплекса
- •7 ТехнологическАя часть
- •Программный комплекс соответствует технологическим нормам.
- •8 Организационно-экономический раздел
- •8.1 Смета затрат на проведение работ
- •8.2 Командировочные расходы
- •8.3 Заработная плата
- •Продолжение таблицы 8.9
- •8.4 Покупные изделия
- •8.5 Накладные расходы
- •8.6 Смета затрат
- •9 Раздел безопасности жизнедеятельности
- •9.1 Анализ достоинств интерфейса пользователя разработанной программы
- •9.2 Рекомендации по организации рабочего места пользователя
- •9.2.1 Рекомендации по выбору помещения для размещения рабочего места
- •9.2.2 Требования к микроклимату, содержанию аэроионов и вредных химических веществ в воздухе на рабочих местах, оборудованных пэвм
- •9.2.3 Требования к уровням шума и вибрации на рабочих местах, оборудованных пэвм
- •9.2.4 Требования к освещению на рабочих местах, оборудованных пэвм
- •9.2.5 Требования к уровням электромагнитных полей на рабочих местах, оборудованных пэвм
- •9.2.6 Общие требования к организации рабочих мест пользователей пэвм
- •9.2.7 Требования к организации и оборудованию рабочих мест с пэвм для обучающихся в общеобразовательных учреждениях и учреждениях начального и высшего профессионального образования
- •9.3 Электробезопасность
- •9.4 Пожарная безопасность
- •Библиографический список
- •Приложение а
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
- •Продолжение приложение а Продолжение листинга а.1
5.2.2 Загрузка объектов в 3d-среду
При инициализации программного комплекса происходит создание внутренней среды (контейнера),инициализация камеры (наблюдателя), подготовка материалов для вывода видео, текста, создание элементов интерфейса и загрузка объектов во внутреннюю среду комплекса из файла в формате 3DS. После чего назначаются функции обработчики событий (листенеры).
Во всех выше перечисленных действиях используется функционал движка для низкоуровневой архитектурой приложения. Программный комплекс – высокоуровневая абстракция для управления самым важным функционалом приложения. Схема работы представлена на рисунке 5.5.
Рисунок 5.5 – Работа с библиотекой Альтернатива
Внутренняя среда (контейнер) создается в виде BSP-дерева (см. пункт «Описание технологий. BSP дерево»). Код представлен в листинге 5.14.
Листинг 5.14 – Создание нового BSP-контейнера
private var rootContainer:BSPContainer = new BSPContainer().
Для создания наблюдателя используется абстракция «камера» по аналогии с кинокамерой. Её положение можно изменять и задавать алгоритмы ее движения и направления взгляда. Код представлен в листинге 5.15.
Листинг 5.15 – Инициализация камеры
// Создание камеры и вьюпорта camera = new Camera3D(). camera.view = new View(stage.stageWidth, stage.stageHeight). camera.view.hideLogo(). addChild(camera.view). addChild(camera.diagram). // Установка начального положения камеры camera.rotationX = 270*Math.PI/180. camera.rotationZ = 90*Math.PI/180. camera.y = -700. camera.z = 160. camera.x = -900.
Камере устанавливается начальная точка отображения, линия взгляда и «окно», через которое видится 3D-мир (вьюпорт), оно равно размеру окна приложения. Код представлен в листинге 5.16.
Листинг 5.16 – Создание контроллера камеры
controller = new SimpleObjectController(stage, camera, 200). controller.accelerate(true). rootContainer.addChild(camera). collider = new EllipsoidCollider(5, 5, 5).
Контроллер необходим для управления камерой и обсчета столкновений ее с объектами в 3D-мире, иначе камера будет пролетать сквозь них, что может показаться пользователю странным и нереалистичным. Код представлен в листинге 5.17.
Листинг 5.17 – Создание кнопок управления текстом и видео
infoButton.label = "Информация об аудитории". infoButton.width = 200. infoButton.move(570, 30). infoButton.visible = false. addChild(infoButton).
videoButton.label = "Видео об аудитории". videoButton.move(570, 60). videoButton.visible = false. addChild(videoButton).
Продолжение листинга 5.17 closeInfoButton.label = "Закрыть". closeInfoButton.width = 100. closeInfoButton.move(620, 505). closeInfoButton.visible = false. addChild(closeInfoButton). videoButton.addEventListener(MouseEvent.CLICK, createImgButton). infoButton.addEventListener(MouseEvent.CLICK, showAudInfo). closeInfoButton.addEventListener(MouseEvent.CLICK, closeAudInfo).
Кнопки размещаются по абсолютным координатам, им присваиваются названия, параметр видимости переключается на false для скрытия, после чего кнопки добавляются в контейнер и им назначаются обработчики событий (EventListener).
При загрузке объектов из файла производится их обход, проверка, являются ли они опорной геометрией (стены, пол, потолок) и вычисление их местоположения (по аудиториями) и в зависимости от этого они распределяются по массивам – массив объектов опорной геометрии, которую необходимо сразу же отобразить и массивы (по 1 на каждую аудиторию), объекты которых будут показаны при необходимости (камера окажется в этой аудитории).
После этого строится BSP-дерево и для объектов загружаются материалы. Код представлен в листинге 5.18.
Листинг 5.18 – Построение BSP-дерева и загрузка материалов для объектов
var sourceGeometry:Vector.<Mesh> = new Vector.<Mesh>(). var sourceSplitters:Vector.<Mesh> = new Vector.<Mesh>().
parser.parse((e.target as URLLoader).data, "textures/"). for each (var object:Object3D in parser.objects) { mesh = object as Mesh. if(mesh){ mesh.addEventListener(MouseEvent3D.MOUSE_DOWN, drawSpot). if(object.name.indexOf("st_") >= 0){ mesh.clipping = Clipping.BOUND_CULLING. sourceGeometry[sourceGeometry.length] = mesh.
Продолжение листинга 5.18 staticObjects[staticObjects.length] = object. } else if(object.name.indexOf("w_") < 0) { mesh.clipping = Clipping.FACE_CLIPPING. if(object.name.indexOf("802_") >=0 ){ mesh.sorting = Sorting.DYNAMIC_BSP. mesh.addEventListener(MouseEvent3D.MOUSE_DOWN, drawSpot). aud802[aud802.length] = mesh. } else if(object.name.indexOf("801_") >=0 ){ mesh.sorting = Sorting.DYNAMIC_BSP. mesh.addEventListener(MouseEvent3D.MOUSE_DOWN, drawSpot).
aud801[aud801.length] = mesh. } else if(object.name.indexOf("804_") >=0 ){ mesh.sorting = Sorting.DYNAMIC_BSP. mesh.addEventListener(MouseEvent3D.MOUSE_DOWN, drawSpot). aud804[aud804.length] = mesh. } else if(object.name.indexOf("804a_") >=0 ){ mesh.sorting = Sorting.DYNAMIC_BSP. mesh.addEventListener(MouseEvent3D.MOUSE_DOWN, drawSpot). aud804a[aud804a.length] = mesh.
} else { ///rootContainer.addChild(mesh). } } } } rootContainer.createTree(sourceGeometry, sourceSplitters, false, staticObjects). // Загрузка текстур var materialLoader:MaterialLoader = new MaterialLoader(). for each (var material in parser.textureMaterials) { material.repeat = true. } materialLoader.load(parser.textureMaterials).
Также, на каждый объект назначается обработчик события «CLICK», для последующей создания интерактивности( обработки мышиных кликов на объектах и показ зависимого контента).