Работа с реакторами

Реактор это любой объект взаимодействия в проекте, будь то модель, метка, текст и т.д. Все реакторы проекта добавляются в глобальный объект reactorController, с помощью которого можно получить доступ к любому реактору проекта. Ниже рассмотрены основные методы этого объекта.

Объект reactorController

Метод

Описание

getNumReactors()

Возвращает кол-во реакторов в проекте. Вызов эквивалентен значению поля size объекта reactorController.

getReactorById(id)

Возвращает реактор по уникальному идентификатору. Идентификатор можно узнать в EV Toolbox, нажав на объект правой кнопкой мыши в панели реакторов.

getReactorByName(name)

Самый часто используемый метод объекта reactorController, позволяет получить реактор по имени, которое отображается в панели объектов.

addReactor(reactor)

Добавляет созданный реактор в проект.

removeReactor(reactorOrId, destroy)

Удаляет указанный реактор из проекта. Параметры:

reactorOrId - реактор, который вы хотите удалить, или его идентификатор. destroy - флаг, если установлен, то реактор будет также уничтожен.

hasReactor(reactorOrId)

Позволяет узнать есть ли указанный ректор в проекте. Параметры:

reactorOrId - реактор или его идентификатор.

Зарезервированные имена

Некоторые реакторы могут присутствовать в проекте лишь в одном экземпляре, в силу своих функциональных особенностей. Такие реакторы имеют зарезервированные имена, т.е. вы не можете присвоить другим объектам такое имя. Также их id совпадает с именем, которое задано латиницей(вы можете увидеть эту информацию, если щелкнете правой кнопкой мыши по реактору в дереве объектов). Чтобы получить доступ к реактору по его имени(методом getReactorByName()), используйте латинское имя реактора, которое представлено в таблице ниже.

Имя(в дереве реакторов)

Имя или id(латиница)

Viewer

Viewer

Система

System

Система трекинга

TrackingSystem

Сцена

Scene

Проекция на экран

HeadUpDisplay

Мышь

Mouse

Создание реакторов

Любой реактор может быть создан в скриптах вручную. Для этого используется глобальный объект reactorFactory и его метод create, в который передаются два параметра - тип реактора и контекст реактора. Контекст реактора един для всех создаваемых реакторов и представлен глобальной переменной reactorContext, типы реакторов приведены ниже:

Реактор

Тип

AudioReactor

audio

CameraManipulatorBaseReactor

camera_manipulator.multitouch

CounterReactor

counter

DistanceReactor

distance

GroupNodeReactor

node.group

HudReactor

node.hud

ImageReactor

rect.image

InteractiveDeviceBaseReactor

interactive_device_base

IntersectorNodeReactor

node.intersector

MarkerReactor

node.marker

ModelReactor

node.model

MouseReactor

mouse_device

NodeReactor

node

RectReactor

node.rect

ScenarioChunkReactor

scenario.chunk

SceneReactor

node.scene

SwitchReactor

switch

SystemReactor

system

Text3dReactor

node.text3d

TextReactor

rect.text

TimerReactor

timer

TrackingSystemReactor

trackingsystem

TransformNodeReactor

node.transform

VideoCaptureReactor

rect.vcap

VideoReactor

rect.video

ViewerReactor

viewer

VRControllerReactor

vr_controller

Рассмотрим пример создания реактора модели:

reactor = reactorFactory:create("node.model", reactorContext) -- создание реактора типа "Модель"
reactorController:addReactor(reactor) -- добавление реактора в объект reactorController, управляющий всеми реакторами

reactor:freeze()      -- заморозка реактора для настройки его параметров

reactor.name                  = "model_logo"
reactor.model                 = resourceRepository:getResourceByName("ev_model.fbx") -- получения ресурса по имени
reactor.nodeMask              = NodeReactor.Mask.VISIBLE -- маска узла, в данном случае видимая
reactor.rotate                = osg.Vec3(90, 0, 0) -- вращение модели, в данном случае 90 градусов по оси X
reactor.trans                 = osg.Vec3(0, 0, 0)   -- перемещение модели, в метрах

reactor:thaw()
reactor:configure() -- завершение конфигурации реактора

Как уже было описано ранее, глобальный объект reactorFactory позволяет создать реактор указанного типа (в данном случае node.model для реактора модели). Вторым параметром идет глобальный объект reactorContext, представляющий собой общий для всех реакторов контекст. Для настройки реактора используются методы freeze(), thaw() и configure(), обозначающие начало и конец настройки параметров реактора соответственно. Между вызовами этих методов идет непосредственно настройка параметров реактора. В данном случае мы устанавливаем имя реактора, Модель.Ресурс модели (ModelReactor.model), маску узла, Система координат.Вращение (TransformNodeReactor.rotate) и Система координат.Перемещение (TransformNodeReactor.trans). Для установки модели используется еще один глобальный объект resourceRepository и его метод getReactorByName, позволяющий получить любой ресурс проекта по его имени(подробнее см. работа с ресурсами).