- •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.4 Обработка команд пользователя
После отрисовки очередного кадра приложение считывает введенные с клавиатуры данные и движения мышью за время предыдущего кадра.
В зависимости от того, выведен ли на экран блок с информацией может быть отключен или включен контроллер камеры. После чего вызывается метод проверки позиции наблюдателя для выгрузки и загрузки объектов аудиторий, где находится пользователь. Код представлен в листинге 5.21.
Листинг 5.21 – Проверка на загрузку/выгрузку объектов
if(logoVisible) controller.disable(). else controller.enable().
checkMyPosition().
После чего происходит обсчет позиции наблюдателя относительно соседних объектов для вычисления столкновений пользователя с объектами. Для этого на месте контроллера камеры создается невидимая сфера, столкновение которой с окружающими объектами и будет определять поведение контроллера камеры.
При столкновении учитывается вектор движения контроллера и, в зависимости от угла между вектором и поверхностью столкновения, рассчитывается скорость скольжения и расстояние смещения вдоль поверхности, с которой произошло столкновение. При угле 90ͦ оба эти параметра будут нулевые, то есть контроллер упрется в поверхность, с которой столкнулся и остановится. Код представлен в листинге 5.22.
Листинг 5.22 – Определение столкновений
var beginCameraVec:Vector3D = new Vector3D(camera.x, camera.y, camera.z). controller.update(). var endCameraVec:Vector3D = new Vector3D(camera.x, camera.y, camera.z). // вектор перемещения var displacement:Vector3D = new Vector3D(). displacement.x = endCameraVec.x – beginCameraVec.x. displacement.y = endCameraVec.y – beginCameraVec.y. // Проверка препятствий var collisionPoint:Vector3D = new Vector3D(). var collisionPlane:Vector3D = new Vector3D(). var onCollision:Boolean = collider.getCollision(beginCameraVec, displacement, collisionPoint, collisionPlane, rootContainer). if (!onCollision){ camera.x = endCameraVec.x.
camera.y = endCameraVec.y. } else { var endVector:Vector3D = collider.calculateDestination(beginCameraVec, displacement, rootContainer). camera.x = endVector.x. camera.y = endVector.y. }
После вычисления новой позиции с учетом столкновения, контроллер перемещается в эту точку и следующий кадр будет отрисован с этой точки.
При нажатии кнопок, запускаются их функции-обработчики.
Для выведения текста отрисовывается его интерфейсный контейнер, а текст динамически загружается из текстового файла. Код представлен в
листинге 5.23.
Листинг 5.23 – Вывод текста
private function showAudInfo(e:MouseEvent):void{ audInfo.visible = true. audInfoBack.visible = true. closeInfoButton.visible = true. scrollBar.visible = true. if(aud802loaded){ AudInfoFromFile("802"). } } private function AudInfoFromFile(url:String):void{
var request:URLRequest = new URLRequest(url + ".txt"). loader = new URLLoader(). try { loader.load(request). } catch (error:SecurityError) { audInfo.text = "A SecurityError has occurred.". } loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler). loader.addEventListener(Event.COMPLETE, loaderCompleteHandler). } function loaderCompleteHandler(event:Event):void { audInfo.htmlText = loader.data. logoVisible = true. scrollBar.scrollTarget = audInfo. }
Для выведения видео создается объект специально написанного класса, который воспроизводит нужное поточное видео и покадрово возвращает bmp-картинку, которая используется как текстура и накладывается на виртуальный экран в 3D-мире. Код представлен в листинге 5.24.
Листинг 5.24 – Создание текстуры из видео
public function VideoMaterial (flvUrl:String) { url = flvUrl. super (null). connection = new NetConnection. connection.addEventListener (NetStatusEvent.NET_STATUS, onConnected).
connection.connect (null). } protected function onConnected (e:NetStatusEvent):void { stream = new NetStream (connection). stream.checkPolicyFile = true. stream.addEventListener (AsyncErrorEvent.ASYNC_ERROR, onError). stream.addEventListener (NetStatusEvent.NET_STATUS, loopVideo). stream.client = { onMetaData: function (info:Object):void {} } video = new Video. video.attachNetStream (stream). video.addEventListener (Event.ENTER_FRAME, updateTexture). texture = new BitmapData (video.width, video.height, true, 0x00FFFFFF). loopVideo (). } protected function loopVideo (e:NetStatusEvent = null):void { if ((e == null) || (e.info.code == "NetStream.Play.Stop")) { played = false. } } public function playVideo():void{ stream.play (url). played = true. }
Продолжение листинга 5.24 protected function updateTexture (e:Event = null):void { if(played) texture.draw (video). }
Код отображения текстуры на объекте представлен в листинге 5.25.
Листинг 5.25 – Отображение текстуры на объекте
private var videoPlane:Plane = new Plane(200, 150). videoPlane.x = -200. videoPlane.y = -1350. videoPlane.z = 180. videoPlane.rotationX = 90*Math.PI/180. videoPlane.rotationZ = 135*Math.PI/180. rootContainer.addChild(videoPlane). videoPlane.visible = true. videoPlane.setMaterialToAllFaces (videoTexture). videoTexture.playVideo().
После чего видео проигрывается на висящем в пространстве экране.