Студопедия

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

КАТЕГОРИИ:

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






Обработка команд пользователя




После отрисовки очередного кадра приложение считывает введенные с клавиатуры данные и движения мышью за время предыдущего кадра.

В зависимости от того, выведен ли на экран блок с информацией может быть отключен или включен контроллер камеры. После чего вызывается метод проверки позиции наблюдателя для выгрузки и загрузки объектов аудиторий, где находится пользователь. Код представлен в листинге 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().

После чего видео проигрывается на висящем в пространстве экране.

 


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