Расстояние

объект Расстояние; DistanceReactor

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

Примечание

Расстояние имеет смысл измерять только когда оба объекта в поле зрения камеры. В противном случае рассчитанное расстояние не определено.

Примечание

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

../_images/distance_screen_1.png

При работе объект расстояние вызывает различные события, соответствующие различным условиям: Больше чем (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) приходят, если текущее расстояние находится в пределах от Значение - Погрешность до Значение + Погрешность. На рисунке эта область обозначена оранжевым штрихом.

../_images/distance_tip_1.png
событие Больше чем; 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 сантиметров:

../_images/distance_onframe.png
событие Объекты отдалились; 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, которое будет выполняться на каждом кадре.