Как разрабатывать приложения смешанной реальности для Microsoft HoloLens: взаимодействие с голограммами

В предыдущей части мы создали заготовку для нашего проекта. Настало время писать код. В этой части мы добавим в наш проект голограмму и научимся взаимодействовать с нею. 

Разработка

Все материалы, используемые в статье, можно скачать по ссылке.

Добавьте папку Article в папку Asset вашего проекта. Выберите префаб Car, переместите его в вашу сцену. Значения transform задайте как на скриншоте.

1

Transform объекта

Вид основной сцены представлен на рисунке:

Главная сцена в Unity.

Главная сцена в Unity

Теперь необходимо изменить компонент Shader у каждого материала нашей машины. Стандартные шейдеры Unity не подходят, т.к. они оказывают высокую нагрузку на HPU. Для наших целей хватит и шейдеров HoloToolkit, например, Standart Fast. Задайте следующие настройки шейдера:

  • Rendering ModeFade
  • Metallic = 0.4

В дальнейшем, возможно, вам придётся создавать свои шейдеры, но в рамках данного цикла статей этот процесс рассматриваться не будет. И напоследок: не забудьте включить предзагрузку шейдеров в настройках проекта, т.к. их компиляция в Runtime может сказаться на производительности.

Установка шейдеров

Установка шейдеров

Существует три основных типа взаимодействия пользователя с голограммами:

  • Взаимодействие взглядом (Gaze);
  • Взаимодействие жестами (Gesture);
  • Взаимодействие голосом (Voice).

Взаимодействие взглядом

Для того, чтобы можно было взаимодействовать с автомобилем (или с отдельной его частью), необходимо добавить компонент Collider (в меню СomponentPhysics, или в инспекторе Add ComponentPhysics). Добавьте Mesh Collider для каждой двери автомобиля. Добавьте в сцену префаб Cursor. Создайте для него простой скрипт:

Прикрепите скрипт к префабу. Теперь, при наведении взгляда на дверь автомобиля, высветится курсор:

4

Можно поэкспериментировать, добавив взаимодействие при наведении взгляда на нужный объект, например, подсветку объекта. Или осуществить нажатие на объект при длительном удержании взгляда. Однако, такие функции есть даже у приложений для CardBoard, ввиду ограниченных возможностей которого нельзя реализовать более сложный интерактив (если я ошибаюсь — просветите меня).

Взаимодействие жестами

Следующий способ взаимодействия — взаимодействие жестами. Он активируется тогда, когда одна или обе ваши руки попадают в поле зрения устройства. К сожалению, Hololens на данный момент располагает ограниченным набором жестов:

  • нажатие (Air-Tap);
  • удержание (Hold);
  • удержание + движение руки (Manipulation и Navigation).

Существует также Bloom-жест, предназначенный для вызова меню или постановки работающего приложения на паузу. Все жесты описаны в операционной системе, а разрабатывать свои на данный момент нельзя, но, надеюсь, эту возможность рано или поздно добавят. Самый распространенный — Tap (он же AirTap, он же «щелчок»). На картинке можно увидеть, как он выполняется.

5

Hololens также распознаёт Double Tap — двойной AirTap. Hold — просто опускаем указательный палец, не поднимая вверх. Navigation и Manipulation используются в связке Hold + движение руки.

В Unity управление жестами реализуется с помощью двух классов: GestureRecognizer и InteractionManager. Первый просто распознаёт указанные жесты, а второй определяет тип взаимодействия, позволяя получить более детальную информацию. Оба класса принадлежат пространству имён UnityEngine.VR.WSA.Input, поэтому обязательно добавляйте его в свои скрипты. Мы будем использовать GestureRecognizer. Сделаем так, чтобы при нажатии на дверь запускалась анимация её открытия. Создадим сначала простой класс CarController:

Теперь создадим класс GestureTest:

Окей, а если нужно повернуть автомобиль? Или рассмотреть какую-то из его частей отдельно? Давайте слегка поменяем наш код, чтобы можно было «оторвать» у автомобиля дверь. В список распознаваемых жестов добавьте GestureSettings.ManipulationTranslate, и подпишитесь на события _recognizer. Полностью код будет выглядеть вот так:

Здесь необходимо дать небольшое пояснение, почему мы использовали Manipulation. Дело в том, что при манипуляции устройство считывает координаты положения руки в абсолютной величине. Это очень удобно использовать при перемещении голограмм в пространстве: они будут следовать за вашей рукой. В случае, если вам необходимо ограничить перемещение, повернуть объект или выполнить Scale объекта, лучше использовать Navigation. При Navigation подразумевается, что передвижение вашей руки происходит вдоль оси X, Y или Z. Как только срабатывает событие OnStart, в пространстве рисуется нормированный куб с координатами вершин -1, 0 и 1, где 0 — центр, который расположен в точке зажатия пальцев. Вместо cumulativeDelta (см. события Manipulation) мы получаем вектор normalizedOffset, значение X, Y или Z которого меняется от -1 до 1, при этом оставшиеся две координаты будут равны 0.

В таком случае, вместо GestureSettings.ManipulationTranslate в метод SetRecognizableGestures добавится GestureSettings.NavigationX (при навигации по оси X). Почему вместо? Потому что Navigation и Manipulation не совместимы в рамках одного экземпляра GestureRecognizer, более того, вы не сможете добавить одновременно навигацию по всем трём осям. Вам придётся создавать несколько классов, отвечающих за то или иное взаимодействие, при этом вы не сможете использовать несколько GestureRecognizer одновременно, даже если они отвечают за разные типы взаимодействий. Переключаться между ними придётся в Runtime, один из способов сделать это — голосовое управление, речь о котором пойдёт ниже.

Взаимодействие голосом

Hololens имеет на борту 4 микрофона и прекрасно распознаёт человеческую речь. Речь можно использовать как для ввода текста, так и для выполнения команд.

В предыдущем примере мы сделали так, чтобы пользователь мог убрать двери автомобиля и заглянуть внутрь. А если захочется детально рассмотреть двигатель? Или выхлопную систему? Можно воспользоваться предыдущим примером и разобрать автомобиль как конструктор. А можно сказать «Покажи мне двигатель» и сразу всё увидеть. Давайте так и сделаем. В качестве «распознавателя голоса» будем использовать класс KeywordRecognizer :

Для того, чтобы работали голосовые команды, необходимо в Capabilities активировать микрофон. В части 2 мы выполнили этот шаг. Осталось поменять код CarController, чтобы осуществить задуманное:

Распознавание голоса в Hololens не очень удобное, так как устройство пока дружит только с английским языком. Зато оно точное и универсальное, и его можно использовать, например, чтобы переключаться между разными GestureRecognizer. При этом, в отличие от GestureRecognizer, у вас может быть несколько KeyWordRecognizer, работающих одновременно. Но делать так не рекомендуется, так как это приводит к дополнительной нагрузке на программу и путанице.

Мы познакомились с основными способами пользовательского взаимодействия с голограммами в Hololens. В следующей части мы научимся взаимодействовать с окружающим пространством.


Выражаем благодарность Тимуру Ахметову, разработчику из компании HoloGroup и департаменту стратегических технологий Microsoft за предоставленный материал.

Для справки: HoloGroup является одним из первых разработчиков для HoloLens в России и 1 сентября 2016 года выпустила первое русскоязычное приложение HoloStudy.