Метка

объект Метка
объект 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

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

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

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

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

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

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

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

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

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

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

параметр Физический размер
параметр 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
Равносильная конструкция