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