Поиск пересечений¶
Содержание
-
объект
Поиск пересечений;
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) -- ищем пересечения только после полной инициализации приложения