Метка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

../_images/dashdot_tracking_size.png

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

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

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

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

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

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

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

Примечание

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

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

Вызывается при пропаже метки из кадра. В отличие от onHide данное событие вызывается сразу.

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

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

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

Вызывается при появлении метки после кратковременной потери, меньшей markerLeftTimeout.

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

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

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

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

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

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

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

marker.enabled = true

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

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

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

marker.enabled = false

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

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

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

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

Параметр Описание
Перемещение (trans) Перемещение объекта относительно родительского объекта.
Вращение (rotate) Поворот объекта относительно родительского объекта.
Масштаб (scale) Масштаб объекта относительно родителя.
Действие Описание
Объект - переместить (setTrans) Установить новое перемещение объекта (значение параметра Перемещение (trans))
Объект - повернуть (setRotate) Установить новый поворот объекта (значение параметра Вращение (rotate))
Объект - масштабировать (setScale) Установить новый масштаб объекта (значение параметра Масштаб (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
Равносильная конструкция