Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал