Метка¶
Contents
-
объект
Метка;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) | Деактивировать метку. |
-
параметр
Технология распознавания;markerType¶ Тип метки: маркерная или безмаркерная.
Маркерная технология подразумевает наличие рамки вокруг метки дополненной реальности, безмаркерная лишь накладывает дополнительные требования к паттерну. Подробнее см. в /articles/tracking
В версии Advanced значения для технологий распознавания могут быть установлены как
MarkerType.DASH_DOTдля меркерной технологии иMarkerType.IMAGEдля безмаркерной.Warning
Данный параметр может быть выставлен только на старте приложения. Изменение данного параметра в процессе работы приложения не будет иметь никакого действия.
-
параметр
Ресурс метки;pattern¶ Паттерн для метки дополненной реальности.
Подробно о требованиях к паттернам см. в разделе /articles/tracking
Warning
Данный параметр может быть выставлен только на старте приложения. Изменение данного параметра в процессе работы приложения не будет иметь никакого действия.
-
параметр
Физический размер;markerPhysSize¶ Ширина метки дополненной реальности.
Для маркерной технологии распознавания физический размер - расстояние между центрами крайних точек или краёв линий (см. изображение).
Для безмаркерной технологии распознавания физический размер - ширина изображения.
Warning
Данный параметр может быть выставлен только на старте приложения. Изменение данного параметра в процессе работы приложения не будет иметь никакого действия.
-
параметр
Включен;enabled¶ Активен ли данный маркер.
Неактивный маркер не будет распознаваться системой, и, соответственно, не будет распознаваться системой и не будет вызывать никаких событий.
Для управления данным параметром существуют действия Включить (enable) и Выключить (disable), при изменении состояния будут вызываться события Включить (enable) и Выключить (disable).
Note
При выключении метки в момент, когда она была показана в кадре, события Маркер - исчез (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
Warning
Если данное действие было вызвано в момент, когда метка была показана, то события Маркер - исчез (onLeft) и
onHideвызваны не будут.
Положение объекта¶
Вводится в Система координат (TransformNodeReactor)
| Параметр | Описание |
|---|---|
| Перемещение (trans) | Перемещение объекта относительно родительского объекта. |
| Вращение (rotate) | Поворот объекта относительно родительского объекта. |
| Масштаб (scale) | Масштаб объекта относительно родителя. |
| Действие | Описание |
|---|---|
| Объект - переместить (setTrans) | Установить новое перемещение объекта (значение параметра Перемещение (trans)) |
| Объект - повернуть (setRotate) | Установить новый поворот объекта (значение параметра Вращение (rotate)) |
| Объект - масштабировать (setScale) | Установить новый масштаб объекта (значение параметра Масштаб (scale)) |
-
параметр
Перемещение;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)
Доступны следующие действия:
сбросить в нулевое положение
поместить на метку автоматически (совместить центр с родительской меткой)
-
параметр
Вращение;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)
Доступны следующие действия:
сбросить в начальное состояние
-
параметр
Масштаб;scale¶ Вводится в Система координат (TransformNodeReactor)
Параметр позволяет задать точный масштаб по координатам (
x,y,z) относительно родительского объекта.Доступны следующие действия:
сбросить в начальное состояние
поместить на метку автоматически (совместить габариты объекта и родительской метки)
зафиксировать оси (масштабировать отдельно по каждой оси, или по всем одновременно)
-
действие
Объект - переместить;setTrans(trans)¶ Установить новое значение перемещения объекта (параметра Перемещение (trans))
Данное действие равносильно присваиванию параметра Перемещение (trans)
transform:setTrans(osg.Vec3(0.0, 0.0, 0.0)) transform.trans = osg.Vec3(0.0, 0.0, 0.0)
Parameters: Перемещение / 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)
Parameters: Вращение / 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)
Parameters: Масштаб / 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))

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