Расстояние¶
-
объект
Расстояние;
DistanceReactor
¶
Объект Расстояние позволяет измерять расстояние между различными объектами в сцене, например, между двумя метками. Объекты, между которыми рассчитывается расстояние, должны поддерживать интерфейс Система координат (TransformNodeReactor) (например Модель (ModelReactor)).
Примечание
Расстояние имеет смысл измерять только когда оба объекта в поле зрения камеры. В противном случае рассчитанное расстояние не определено.
Примечание
Все значения, связанные с расстоянием, указываются в метрах, если явно не оговорено иное.

При работе объект расстояние вызывает различные события, соответствующие различным условиям: Больше чем (onGreater), Меньше чем (onLess), Принадлежит отрезку (onInsideSegment) и т.п.
Расстояние¶
Вводится в Расстояние (DistanceReactor)
Свойство | Описание |
---|---|
Расстояние (distance) | Расстояние между объектами. |
Параметр | Описание |
---|---|
Первый объект (firstNodeReactor) | Первый объект для расчёта. |
Второй объект (secondNodeReactor) | Второй объект для расчёта. |
-
свойство
Расстояние;
distance
¶ Расстояние между объектами. Если расчет расстояния не проводился (т.е. не было вызвано Рассчитать расстояние (updateState)), то расстояние не определено (равно nil).
-
параметр
Первый объект;
firstNodeReactor
¶ Параметр позволяет выбрать первый объект для расчёта расстояния. Это может быть, например, система координат, метка, текст, модель и т.д.
-
параметр
Второй объект;
secondNodeReactor
¶ Аналогично параметру Первый объект (firstNodeReactor).
Расчет расстояния¶
-
действие
Рассчитать расстояние;
updateState
()¶ Единственное действие объекта. Рассчитывает расстояние между выбранными объектами. При каждом вызове запускаются все события, удовлетворяющие текущему расстоянию. Подробнее, см. Анализ расстояния.
Анализ расстояния¶
Событие | Описание |
---|---|
Равно (onEqual) | Происходит, когда Расстояние (distance) равно заданному значению. |
Неравно (onNotEqual) | Происходит, когда Расстояние (distance) не равно заданному значению |
Больше чем (onGreater) | Происходит, когда Расстояние (distance) больше заданного значения. |
Меньше чем (onLess) | Происходит, когда Расстояние (distance) меньше заданного значения. |
Принадлежит отрезку (onInsideSegment) | Происходит, когда Расстояние (distance) принадлежит заданному отрезку. |
Не принадлежит отрезку (onOutsideSegment) | Происходит, когда Расстояние (distance) не принадлежит заданному отрезку. |
Объекты отдалились (onMovedAside) | Происходит, когда Расстояние (distance) становится больше заданного. |
Объекты сблизились (onMovedCloser) | Происходит, когда Расстояние (distance) становится меньше заданного. |
Очень часто во время использования приложения с дополненной реальностью оптический трекинг работает в неидеальных условиях: может дрожать рука со смартфоном или веб камерой, меняться освещение, метки перемещаются по поверхности. Все это не позволяет рассчитывать расстояние в реальном времени со стопроцентной точностью. В связи c этим некоторые события имеют параметры для указания погрешности вычислений для более стабильной и плавной работы приложения.
-
событие
Равно;
onEqual
¶ Происходит, когда расстояние равно заданному значению.
Param Значение / value - number: расстояние. Param Погрешность / measurementError - number: погрешность (радиус окрестности указанного значения).
-
событие
Неравно;
onNotEqual
¶ Происходит, когда расстояние не равно заданному значению
Param Значение / value - number: расстояние. Param Погрешность / measurementError - number: погрешность (радиус окрестности указанного значения).
События Равно (onEqual) и Неравно (onNotEqual) приходят, если текущее расстояние находится в пределах от Значение - Погрешность
до Значение + Погрешность
. На рисунке эта область обозначена оранжевым штрихом.

-
событие
Больше чем;
onGreater
¶ Происходит, когда расстояние больше заданного значения.
Param Значение / value - number: расстояние.
-
событие
Меньше чем;
onLess
¶ Происходит, когда расстояние меньше заданного значения.
Param Значение / value - number: расстояние.
-
событие
Принадлежит отрезку;
onInsideSegment
¶ Происходит, когда расстояние принадлежит заданному отрезку (включая его границы).
Param От / valueFrom - number: левая граница отрезка. Param До / valueTo - number: правая граница отрезка.
Примечание
Если расстояние равно граничным значениям, событие происходит.
-
событие
Не принадлежит отрезку;
onOutsideSegment
¶ Происходит, когда расстояние не принадлежит заданному отрезку.
Param От / valueFrom - number: левая граница отрезка. Param До / valueTo - number: правая граница отрезка.
Примечание
Если расстояние равно граничным значениям, событие не происходит.
События Равно (onEqual), Неравно (onNotEqual), Больше чем (onGreater), Меньше чем (onLess), Принадлежит отрезку (onInsideSegment) и Не принадлежит отрезку (onOutsideSegment) происходят при каждом вызове Рассчитать расстояние (updateState), если текущее расстояние удовлетворяет указанным в событиях параметрам. Например, в следующем сценарии событие Больше чем (onGreater) будет запускаться на каждом кадре (обычно, 60 раз в секунду!), если текущее расстояние будет больше 15 сантиметров:

-
событие
Объекты отдалились;
onMovedAside
¶ Приходит, когда расстояние становится больше заданного.
Param Значение / value - number: значение, при котором приходит событие. Param Отклонение / minDeviation - number: величина, определяющая, на какое минимальное расстояние должны сблизиться два объекта, чтобы указанное событие пришло вновь (рассчитывается, как value - minDeviation).
-
событие
Объекты сблизились;
onMovedCloser
¶ Приходит, когда расстояние становится меньше заданного.
Param Значение / value - number: значение, при котором приходит событие. Param Отклонение / minDeviation - number: величина, определяющая, на какое максимальное расстояние должны отдалиться два объекта, чтобы указанное событие пришло вновь (рассчитывается, как value + minDeviation).
События Объекты отдалились (onMovedAside) и Объекты сблизились (onMovedCloser) запускаются, если текущее расстояние между двумя объектами соответственно больше или меньше заданного. Так как объекты практически никогда не находятся в состоянии абсолютного покоя, расстояние между ними может постоянно колебаться и постоянно пересекать заданные значения. Чтобы этого не происходило, необходимо задать параметр «Отклонение». Он определяет разницу между текущим расстоянием и расстоянием, заданным параметром «Значение», до преодоления которой событие повторно не придет.
Advanced¶
Пример кода:
local firstModel = reactorController:getReactorByName("Model1")
local secondModel = reactorController:getReactorByName("Model2")
local distance = reactorController:getReactorByName("Distance")
local firstModelX = -5 -- смещение первой модели по оси X
local step = 0.05 -- шаг, с которым первая модель будет двигаться
distance.firstNodeReactor = firstModel -- устанавливаем в объект Расстояние первую модель
distance.secondNodeReactor = secondModel -- устанавливаем в объект Расстояние вторую модель
local firstModelM = firstModel:getMatrix()
firstModel:setMatrix(firstModelM * osg.Matrix.translate(osg.Vec3(firstModelX, 0, 0))) -- устанавливаем для первой модели матрицу со сдвигом
local function moveModel()
firstModelX = firstModelX + step -- перемещаемся по X на шаг
firstModel:setMatrix(firstModelM * osg.Matrix.translate(osg.Vec3(firstModelX, 0, 0)))
distance:updateState() -- рассчитываем расстояние между двумя объектами
end
distance:subscribeEvent("onMovedCloser", function()
bus:unsubscribe(moveModel)
end, 1, 0.01) -- подписываемся на событие onMovedCloser - если модели сблизились до 1 метра(с девиацией 0.01), то перестаем двигать первую модель
bus:subscribe(moveModel) -- подписываем движение первой модели на bus, которое будет выполняться на каждом кадре.