Метка

объект Метка; MarkerReactor

Производный от Система координат (TransformNodeReactor)

Маркер - ключевой объект дополненной реальности. К маркеру, который камера видит в реальном мире привязываются объекты виртуальной сцены. По сути своей маркер является объектом Система координат (TransformNodeReactor), видимостью и положением которого управляет система трекинга приложения. Таким образом, взаимодействие с меткой дополненной реальности ничем не отличается от взаимодействия с Система координат (TransformNodeReactor).

Для «соединения» метки и каких-либо объектов (например, Модель (ModelReactor)) достаточно добавить модель в маркер при помощи интерфейса панели «Проект». Для того, чтобы отследить показ или скрытие метки, следует использовать события Узел.Объект - показан (NodeReactor.onShowed) и Узел.Объект - скрыт (NodeReactor.onHidden) соответственно. Дополнительно для более точного взаимодействия добавлены события Маркер - исчез (onLeft) и Маркер - появился (onEntered).

Работа с меткой

Вводится в Метка (MarkerReactor)

Параметр Описание
Технология распознавания (markerType) Технология распознавания (маркерная или безмаркерная).
Ресурс метки (pattern) Файл изображения, используемый для распознавания.
Размер сетки (gridSize) Размер двумерной сетки, используемой детектором при анализе и распознавании изображения (только для безмаркерной технологии). Распределение особых точек по сетке можно посмотреть в окне «Анализ метки».
Физический размер (markerPhysSize) Физический размер метки, которая будет использоваться для распознавания.
Физический размер (enhancedCloseupTracking) Улучшенный трекинг вблизи метки.
Показывать автоматически (autoShow) Автоматическое отображение всех дочерних узлов метки при ее появлении (см событие Маркер - появился (onEntered)).
Скрывать автоматически (autoHide) Автоматическое скрытие всех дочерних узлов метки при ее исчезновении (см. событие Маркер - исчез (onLeft)).
Включен (enabled) Параметр, позволяющий временно отключить распознавание данной метки.
Событие Описание
Маркер - исчез (onLeft) Вызывается при мгновенном пропадании метки из поля зрения.
Маркер - появился (onEntered) Вызывается при мгновенном появлении метки в поле зрения.
Включён (onEnabled) Вызывается при активации метки.
Выключен (onDisabled) Вызывается при деактивации метки.
Действие Описание
Включить (enable) Активировать метку.
Выключить (disable) Деактивировать метку.
../_images/marker_marker_actions.png
параметр Технология распознавания; markerType

Тип метки: маркерная или безмаркерная.

Маркерная технология подразумевает наличие рамки вокруг метки дополненной реальности, безмаркерная лишь накладывает дополнительные требования к паттерну. Подробнее см. Технология трекинга

В версии Advanced значения для технологий распознавания могут быть установлены как MarkerType.DASH_DOT для маркерной технологии и MarkerType.IMAGE для безмаркерной.

Предупреждение

Данный параметр может быть выставлен только на старте приложения. Изменение данного параметра в процессе работы приложения не будет иметь никакого действия.

параметр Ресурс метки; pattern

Паттерн для метки дополненной реальности.

Подробно о требованиях к паттернам см. в разделе Технология трекинга

Предупреждение

Данный параметр может быть выставлен только на старте приложения. Изменение данного параметра в процессе работы приложения не будет иметь никакого действия.

параметр Размер сетки; gridSize

Важно

Только для безмаркерной технологии!

Размер двумерной сетки, используемый детектором при анализе и распознавании изображения. Распределение особых точек по сетке можно посмотреть в окне «Анализ метки»(для выбора которого нажмите правой кнопкой мыши на маркер в панели объектов).

параметр Физический размер; markerPhysSize

Ширина метки дополненной реальности.

Для маркерной технологии распознавания физический размер - расстояние между центрами крайних точек или краёв линий (см. изображение).

../_images/dashdot_tracking_size.png

Для безмаркерной технологии распознавания физический размер - ширина изображения.

Предупреждение

Данный параметр может быть выставлен только на старте приложения. Изменение данного параметра в процессе работы приложения не будет иметь никакого действия.

параметр Физический размер; enhancedCloseupTracking

Параметр позволяет улучшить трекинг вблизи метки.

параметр Включен; enabled

Активен ли данный маркер.

Неактивный маркер не будет распознаваться системой, и, соответственно, не будет вызывать никаких событий.

Для управления данным параметром существуют действия Включить (enable) и Выключить (disable), при изменении состояния будут вызываться события Включён (onEnabled) и Выключен (onDisabled).

Примечание

При выключении метки в момент, когда она была показана в кадре, события Маркер - исчез (onLeft), Узел.Объект - скрыт (NodeReactor.onHidden) и т.п. вызваны не будут.

параметр Показывать автоматически; autoShow

Автоматический показ всех дочерних узлов метки при ее появлении.

параметр Скрывать автоматически; autoHide

Автоматическое скрытие всех дочерних узлов метки при ее исчезновении.

событие Маркер - исчез; onLeft

Вызывается при пропаже метки из кадра. В отличие от Узел.Объект - скрыт (NodeReactor.onHidden) данное событие вызывается сразу.

см. также событие Маркер - появился (onEntered).

событие Маркер - появился; onEntered

Вызывается при появлении метки в кадре.

событие Включён; onEnabled

Вызывается при активации метки, т.е. при изменении параметра Включен (enabled) на true или вызове действия Включить (enable).

событие Выключен; onDisabled

Вызывается при деактивации метки, т.е. при изменении параметра Включен (enabled) на false или вызове действия Выключить (disable).

действие Включить; enable()

Включить метку.

Данный вызов равносилен присваиванию:

marker.enabled = true

действие Выключить; disable()

Выключить метку.

Данный вызов равносилен присваиванию:

marker.enabled = false

Предупреждение

Если данное действие было вызвано в момент, когда метка была показана, то события Маркер - исчез (onLeft) и onHide вызваны не будут.

Положение объекта

Вводится в Система координат (TransformNodeReactor)

Параметр Описание
Перемещение (trans) Перемещение объекта относительно родительского объекта.
Вращение (rotate) Поворот объекта относительно родительского объекта.
Масштаб (scale) Масштаб объекта относительно родительского объекта.
Действие Описание
Объект - переместить (setTrans) Установить новое перемещение объекта (значение параметра Перемещение (trans))
Объект - повернуть (setRotate) Установить новый поворот объекта (значение параметра Вращение (rotate))
Объект - масштабировать (setScale) Установить новый масштаб объекта (значение параметра Масштаб (scale))
Объект - преобразовать (setTransform) Установить новые значения сразу для трех параметров: Перемещение (trans), Вращение (rotate), Масштаб (scale)
../_images/transform_transform_actions.png
параметр Перемещение; trans

Вводится в Система координат (TransformNodeReactor)

Параметр позволяет задать точный сдвиг объекта по координатам (x, y, z) относительно родительского объекта.

Перемещение задаётся в виде объекта osg.Vec3. Пример использования:

-- Заставим мячик прыгать на месте
local ball = ...

local velocity = 0                   -- Текущая скорость объекта
ball.trans = osg.Vec3(0, 0, 0.2)     -- Задаём начальное положение - 20 см.

local delta_time = 0.01              -- Время между кадрами для обновления

-- Функция для обновления
function update_velocity_and_position()
    -- Обновляем положение объекта.
    -- Для простоты считаем, что скорость за этот период времени не менялась
    ball.trans = ball.trans + osg.Vec3(0, 0, 1) * velocity * delta_time

    -- Обновляем скорость: на мячик действует ускорение свободного падения
    -- 9.8 м/с^2, с предыдущей итерации прошло время delta_time
    velocity = velocity - 9.8 * delta_time

    -- Мячик достиг земли - отскок от земли
    if ball.trans:z() <= 0 then
        velocity = - velocity
    end
end

-- Вызывать функцию обновления позиции каждые delta_time секунд
timer:subscribe(update_velocity_and_position, delta_time)

Доступны следующие действия:

  • img_reset сбросить в нулевое положение
  • img_auto поместить на метку автоматически (совместить центр с родительской меткой)
параметр Вращение; rotate

Вводится в Система координат (TransformNodeReactor)

Параметр позволяет задать точный поворот объекта по осям (x, y, z) относительно родительского объекта.

В данном параметре используются углы Крылова (или углы Эйлера), где порядок поворота осей определяется в порядке: z, x, y. Все углы задаются в градусах.

Параметр имеет тип osg.Vec3, где каждая компонента вектора соответствует своей оси.

Для перевода в градусы и из градусов можно воспользоваться функциями deg2rad(x) и rad2deg(x). Данные функции могут быть использованы как для чисел, так и для векторов osg.Vec3, osg.Vec2.

Для перевода в/из osg.Quat можно воспользоваться функциями euler2quat(ypr) и quat2euler(quat). Важно отметить, что обе функции работают с векторами в радианах. Таким образом, для получения кватерниона из параметра Вращение (rotate), а также наоборот необходимо сделать по два вызова:

local model = ...

-- Получение кватерниона по параметру rotate
local rotation_quat = euler2quat(deg2rad(model.rotate))

-- Присвоение кватерниона параметру rotate
model.rotate = rad2deg(quat2euler(rotation_quat))

Пример вращения логотипа:

local logo = ...

local function update_logo_rotation()
    -- Забираем текущий поворот
    local rot = logo.rotate

    -- Добавляем небольшое вращение вдоль одной из осей
    rot:y((rot:y() + 1) % 360)

    -- Присваиваем новое значение объекту
    logo.rotate = rot
end

-- Подписываемся на таймер, чтобы обновление происходило каждые 0.01 секунд
timer:subscribe(update_logo_rotation, 0.01)

Пример поворота объекта в сторону метки:

local model = ...
local marker = ...

-- Функция построения кватерниона для поворота от from к to
local function _make_directed_rotation(from, to)
    -- Вращать будем относительно оси, ортогональной обоим векторам,
    --   для его получения воспользуемся векторным произведением
    local axis = osg.Vec3.cross(from, to)

    -- Для получения угла вращения воспользуемся скалярным произведением:
    --   v1 * v2 = |v1| |v2| cos(angle(v1, v2)) => angle = acos(v1 * v2 / (|v1| |v2|))
    local angle_cos = osg.Vec3.dot(from, to) / (from:length() * to:length())
    local angle = math.acos(angle_cos)

    -- Возвращаем кватернион вращения с найденной осью и углом
    return osg.Quat(angle, axis)
end

local function update_rotation()
    -- Направление от модели к метке
    local delta_trans = marker.trans - model.trans

    -- Получим вращение модели в виде кватерниона
    local rotation = _make_directed_rotation(osg.Vec3(1, 0, 0), delta_trans)

    -- Присваиваем вращение. Заметим, что необходимо перевести кватернион
    -- сначала в углы Крылова, а затем перевести их значения из радианов в градусы
    model.rotate = deg2rad(quat2euler(rotation))
end

-- Будем обновлять вращение каждые 10 миллисекунд
timer:subscribe(update_rotation, 0.01)

Доступны следующие действия:

  • img_reset2 сбросить в начальное состояние
параметр Масштаб; scale

Вводится в Система координат (TransformNodeReactor)

Параметр позволяет задать точный масштаб по координатам (x, y, z) относительно родительского объекта.

Доступны следующие действия:

  • img_reset3 сбросить в начальное состояние
  • img_auto3 поместить на метку автоматически (совместить габариты объекта и родительской метки)
  • img_lock зафиксировать оси (масштабировать отдельно по каждой оси, или по всем одновременно)
действие Объект - переместить; setTrans(trans)

Установить новое значение перемещения объекта (параметра Перемещение (trans))

Данное действие равносильно присваиванию параметра Перемещение (trans)

transform:setTrans(osg.Vec3(0.0, 0.0, 0.0))
transform.trans = osg.Vec3(0.0, 0.0, 0.0)

Параметры:Перемещение / trans – Новое значение перемещения
действие Объект - повернуть; setRotate(rotate)

Установить новое значение вращения объекта (параметра Вращение (rotate)).

Данное действие равносильно присваиванию параметра Вращение (rotate)

transform:setRotate(osg.Vec3(0.0, 0.0, 0.0))
transform.rotate = osg.Vec3(0.0, 0.0, 0.0)

Параметры:Вращение / rotate – Новое значение вращения
действие Объект - масштабировать; setScale(scale)

Установить новое значение масштабирования объекта (параметра Масштаб (scale)).

Данное действие равносильно присваиванию параметра Масштаб (scale)

transform:setScale(osg.Vec3(1.0, 1.0, 1.0))
transform.scale = osg.Vec3(1.0, 1.0, 1.0)

Параметры:Масштаб / scale – Новое значение вращения
действие Объект - преобразовать; setTransform(trans, rotate, scale)

Установить новые значения перемещения, вращения и масштаба (параметров Перемещение (trans), Вращение (rotate), Масштаб (scale). Данный вызов равносилен последовательным вызовам Объект - переместить (setTrans), Объект - повернуть (setRotate), Объект - масштабировать (setScale):

Следующие две конструкции полностью равносильны:

model:setTransform(osg.Vec3(0.0, 0.0, 0.0), osg.Vec3(0.0, 0.0, 0.0), osg.Vec3(1.0, 1.0, 1.0))
model:setTrans(osg.Vec3(0.0, 0.0, 0.0))
model:setRotate(osg.Vec3(0.0, 0.0, 0.0))
model:setScale(osg.Vec3(1.0, 1.0, 1.0))

transform_set_transform_image
transform_set_transform_separated_image
Равносильная конструкция

Advanced

Вспомогательные методы Описание
getMatrix() Получить матрицу трансформации объекта.
setMatrix(matrix, skipDecomposition)

Задать матрицу трансформации объекта

Параметры:

matrix - матрица класса osg.Matrix.

skipDecomposition - флаг типа boolean - пропустить шаг декомпозиции матрицы, если true.