Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Diplonote_v1.3 RC 6.doc
Скачиваний:
3
Добавлен:
27.10.2018
Размер:
12.94 Mб
Скачать

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», для последующей создания интерактивности( обработки мышиных кликов на объектах и показ зависимого контента).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]