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

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

Объект reactorController

Метод Описание
getNumReactors() Возвращает кол-во реакторов в проекте. Вызов эквивалентен значению поля size объекта reactorController.
getReactorById(id) Возвращает реактор по уникальному идентификатору. Идентификатор можно узнать в EV Toolbox, нажав на объект правой кнопкой мыши в панели реакторов.
getReactorByName(name) Самый частоиспользуемый метод объекта reactorController, позволяет получить реактор по имени, которое отображается в панели объектов.
addReactor(reactor) Добавляет созданный реактор в проект.
removeReactor(reactorOrId, destroy)

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

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

hasReactor(reactorOrId)

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

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

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

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