Поиск пересечений¶
- объект Поиск пересечений; IntersectorReactor¶
Данный объект используется для поиска пересечений виртуального луча, исходящего из заданной точки, с объектами Сцены. Объекты, которые проверяются на пересечение, указываются явно (см. событие Пересечение (onHit))
Обзор возможностей¶
Свойство |
Описание |
|---|---|
Длина виртуального луча, с которым рассчитываются пересечения, в метрах. |
|
Включение/отключение визуализации виртуального луча цилиндром. |
|
Радиус визуализации виртуального луча в метрах. |
|
Цвет цилиндра, используемого для визуализации. |
Событие |
Описание |
|---|---|
Запускается, если обнаружено пересечение/отсутствие пересечения с выбранным объектом. |
Действие |
Описание |
|---|---|
Ищет пересечение. |
|
Включить визуализацию лучом. |
|
Выключить визуализацию лучом. |
- параметр Длина сегмента; 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) -- ищем пересечения только после полной инициализации приложения