Поиск пересечений¶
Contents
-
объект
Поиск пересечений;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()¶ Данное действие выключает визуализацию лучом.
Поиск пересечений на практике¶
Note
Виртуальный луч объекта Пересечение направлен вниз по оси Z и начинается в центре системы координат. Чтобы управлять положением луча в проекте, добавьте его в объект Система координат (TransformNodeReactor) и тогда можно будет его смещать и вращать.
Чтобы найти пересечения, в обязательном порядке нужно вызывать действие Найти пересечение (findIntersection).
Пересечения рассчитываются только с объектами у которых включены Узел.Видимость (NodeReactor.visible) и Узел.Обработка мыши (NodeReactor.handleClick). Если пересечение найдено с несколькими объектами, обработано будет пересечение с ближайшим.
Случай “Не найдено ни одного пересечения”¶
Если необходимо обработать случай, когда пересечение найдено, но не важен объект, с которым оно найдено, необходимо в событии Пересечение (onHit) параметр “Пересечение с” установить в значение “Не определено”, а параметр “Не найдено” в значение false.
Случай “Найдено какое-либо пересечение”¶
Если необходимо обработать случай, когда не найдено ни одного пересечения, необходимо в событии Пересечение (onHit) параметр “Пересечение с” установить в значение “Не определено”, а параметр “Не найдено” в значение true.
Advanced¶
Important
Действие Найти пересечение (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) -- ищем пересечения только после полной инициализации приложения