Поиск пересечений

объект Поиск пересечений; IntersectorReactor

Данный объект используется для поиска пересечений виртуального луча, исходящего из заданной точки, с объектами Сцены. Объекты, которые проверяются на пересечение, указываются явно (см. событие Пересечение (onHit))

Обзор возможностей

Свойство Описание
Длина сегмента (segmentLength) Длина виртуального луча, с которым рассчитываются пересечения, в метрах.
Визуализация лучом (visualizationEnabled) Включение/отключение визуализации виртуального луча цилиндром.
Радиус луча (visualizationWidth) Радиус визуализации виртуального луча в метрах.
Цвет луча (visualizationColor) Цвет цилиндра, используемого для визуализации.
Событие Описание
Пересечение (onHit) Запускается, если обнаружено пересечение/отсутствие пересечения с выбранным объектом.
Действие Описание
Найти пересечение (findIntersection) Ищет пересечение.
Включить визуализацию (enableVisualization) Включить визуализацию лучом.
Выключить визуализацию (disableVisualization) Выключить визуализацию лучом.
параметр Длина сегмента; segmentLength

Длина виртуального луча, с которым рассчитываются пересечения, в метрах.

параметр Визуализация лучом; visualizationEnabled

Включение/отключение визуализации виртуального луча цилиндром. Высота цилиндра не превышает значение параметра Длина сегмента (segmentLength), при этом, если найдено пересечение с некоторым объектом сцены, высота цилиндра соответствует расстоянию до этого объекта.

параметр Радиус луча; visualizationWidth

Радиус визуализации виртуального луча в метрах. Определяет радиус цилиндра при визуализации и не влияет на результат расчета пересечений.

параметр Цвет луча; visualizationColor

Цвет цилиндра, используемого для визуализации.

событие Пересечение; onHit

Запускается при нахождении/отсутствии пересечения с заданным объектом сцены.

Param Пересечение с / reactorName:
 Id Объекта, наличие пересечения с которым проверяется.
Param Не найдено / missed – boolean:
 аргумент, определяющий, должно ли событие приходить при отсутствии пересечения с заданным объектом или наоборот.
действие Найти пересечение; findIntersection()

Поиск пересечения с объектами и обновление визуализации, если она включена. Пересечения рассчитываются только с объектами, которые видны в сцене и у которых включен параметр Узел.Обработка мыши (NodeReactor.handleClick).

действие Включить визуализацию; enableVisualization()

Данное действие включает визуализацию лучом.

действие Выключить визуализацию; disableVisualization()

Данное действие выключает визуализацию лучом.

Поиск пересечений на практике

Примечание

Виртуальный луч объекта Пересечение направлен вниз по оси Z и начинается в центре системы координат. Чтобы управлять положением луча в проекте, добавьте его в объект Система координат (TransformNodeReactor) и тогда можно будет его смещать и вращать.

Чтобы найти пересечения, в обязательном порядке нужно вызывать действие Найти пересечение (findIntersection).

Пересечения рассчитываются только с объектами у которых включены Узел.Видимость (NodeReactor.visible) и Узел.Обработка мыши (NodeReactor.handleClick). Если пересечение найдено с несколькими объектами, обработано будет пересечение с ближайшим.

Случай «Не найдено ни одного пересечения»

Если необходимо обработать случай, когда пересечение найдено, но не важен объект, с которым оно найдено, необходимо в событии Пересечение (onHit) параметр «Пересечение с» установить в значение «Не определено», а параметр «Не найдено» в значение false.

Случай «Найдено какое-либо пересечение»

Если необходимо обработать случай, когда не найдено ни одного пересечения, необходимо в событии Пересечение (onHit) параметр «Пересечение с» установить в значение «Не определено», а параметр «Не найдено» в значение true.

Advanced

Важно

Действие Найти пересечение (findIntersection) будет работать, только когда приложение запущено и все объекты были проинициализированы(т.е. добавлены в сцену), поэтому если вы хотите в скриптах найти пересечение с объектом на старте приложения, то делайте это в подписке на событие Система.Приложение запущено (SystemReactor.onApplicationStart)

Пример кода:

local model = reactorController:getReactorByName("Model")
local image = reactorController:getReactorByName("Image")
local intersector = reactorController:getReactorByName("Intersector")
local system = reactorController:getReactorByName("System")

intersector:subscribeEvent("onHit", function()
    image:show()
end, model.id, false) -- в качестве параметров указывается id реактора, с которым ищется пересечение и флаг false, т.е. пересечение должно быть найдено

system:subscribeEvent("onApplicationStart", function()
    intersector:findIntersection()
end) -- ищем пересечения только после полной инициализации приложения