Виртуальная реальность с Google

ff0ed089690b4028b42478b96cb1ca2a.jpg

Автор: Николай Хабаров, Embedded Expert DataArt, евангелист технологий умного дома, изобретатель.

Эта статья — краткий экскурс в основы работы с виртуальной и дополненной реальностью. Я не ставил задачу в полной мере раскрыть все возможности Google VR SDK и планировал дать минимальную базу тем, кто интересуется этими технологиями и хотел бы начать работать с ними.

Из истории 3D


Чтобы увидеть трехмерное изображение, первое, что нам необходимо сделать, — организовать передачу двух различных изображений для левого и правого глаза. Понятно, что, когда мы в обычной жизни смотрим на любой предмет, наши глаза видят его под разными углами, поскольку находятся на некотором расстоянии друг от друга. Собственно, за счет этого мы и воспринимаем трехмерное пространство вокруг.

Сама идея 3D-изображения довольно стара, существует множество технологий, позволяющих воспроизводить трехмерную картинку. Например, все видели в кинотеатрах анаглифные очки с линзами разного цвета. Изображение подается на экран с двух ракурсов и разделенным на две части спектром цвета. В этом случае каждый ракурс пропускается через один из фильтров, за счет чего и появляется иллюзия объема. Главный недостаток подобного метода — заметная потеря цветопередачи.

На следующем этапе развития технологии появились так называемые затворные очки, которые называют еще светоклапанными, — их тоже используются в кинотеатрах. Устройство таких очков отличается: на каждой линзе стоит небольшой экран с разрешением в один пиксель, он может либо полностью закрыть изображение, либо целиком пропустить его. Очки поочередно переключаются между экранами, позволяя нам видеть изображение то одним, то другим глазом. При этом, чтобы увидеть объемную картинку, нам необходимо синхронизировать переключение очков с телевизором или киноэкраном. Это можно сделать по радиоканалу, либо, как чаще всего и бывает, с помощью установленного на очках инфракрасного приемника и передатчика, расположенного возле экрана. Еще один недостаток такого метода состоит в потере яркости — ведь половину времени мы одним глазом ничего не видим. Кроме того, от самого оборудования для воспроизведения требуется высокая частота смены кадров.

Интересным развитием идеи стала поляризационная технология — с помощью фильтра мы можем отсечь только необходимую часть поляризованных в разных направлениях волн. Наверняка все знакомы с поляризационными фильтрами для фотоаппаратов, которые позволяют избавиться от бликов. В случае с 3D-изображением, специальным образом готовится экран, одни строчки которого начинают излучать вертикально поляризованный свет, другие — свет, поляризованный горизонтально. В кинотеатрах также используется круговая поляризация, когда свет закручивается вправо или влево.

Простота — залог успеха


Изобретатели Google Cardboard сделали все просто и гениально, решив использовать для передачи трехмерной картинки обыкновенный смартфон. До этого существовало множество вариантов очков, оборудованных различными экранами, но разрешение у матрицы таких экранов было весьма скромным. При этом такие очки были очень дорогими. А предложенный Google Cardboard — кусок обычного картона с двумя линзами, в который остается вложить свой телефон. Этого достаточно, чтобы увидеть трехмерную картинку своими глазами.


Дальнейшим развитием Cardboard стало появление Daydream — от предшественника устройство принципом работы не отличается, но, по сравнению с ним, имеет существенные плюсы. В частности, материал, из которого выполнен сам Daydream, уже не просто картонка, он гораздо более высокого качества. Другой неоспоримый плюс — софтовая поддержка самого Daydream.

Экран любого телефона обладает набором характеристик, как и линзы Cardboard. Классический Cardboard имеет маркировку в виде QR-кода, и перед тем как поместить в него свой телефон, нужно было это код считать, чтобы занести в телефон параметры линз. Совместив параметры, устройство могло подсчитать, как отображать картинку, чтобы она дошла до вас с минимальными искажениями.

При использовании Daydream достаточно просто положить устройство, чтобы оно считало параметры самих очков при помощи NFС. Сама метка спрятана в задней крышке.

Также у Cardboard есть небольшой пульт управления; многие производители выпустили аналоги Cardboard и свои пульты, самые разнообразные: инерционные, гравитационные, просто джойстики. У Daydream есть две кнопки и небольшой тачпад, который позволяет, перемещая палец, двигать объекты в пространстве или перемещаться самому. У Сardboard была всего лишь одна кнопка, на корпусе самих очков, которая просто фиксировала нажатие и передавала эту информацию на экран телефона.

Cardboard можно было использовать с любым телефоном, который физически помещался в саму коробку и был очень дешевым. Для работы с Daydream на момент написания статьи сертифицированы всего три телефона: ZTE Axon 7, Google Pixel и Motorola Moto Z, к ним планируют добавлять новые модели, но для использования Daydream обязательно требуется операционная система не ниже Android 7.0.

Взаимодействие с виртуальной реальностью


Самое интересное начинается, когда мы не просто смотрим на трехмерное изображение (3D можно увидеть и по телевизору), а начинаем вращать головой.

Любой современный телефон оборудован микроэлектромеханическими cенсорами. Это микроскопические устройства, в которых на кристалле собрана электроника и небольшие подвижные механические детали, позволяющие отслеживать различные внешние факторы. Наверное, все знают, что такое гироскоп — устройство, с помощью которого можно узнать угол поворота. В случае MEMS-датчиков, гироскоп отдает не сам угол поворота, а угловую скорость. Внутри него есть небольшой элемент, который движется под действием силы Кориолиса (надеюсь, вы вспомните, что это такое, из курса физики). Это позволяет узнать угловую скорость, а уже проинтегрировав ее, мы сможем определить и угол поворота. Правда, этот метод плох тем, что, поворачивая телефон в разные стороны, мы, скорее всего, не сможем вернуться в ту же точку, где были изначально.

Второй интересный датчик — акселерометр. Он определяет действующие на телефон силы, в частности, ускорение свободного падения. В спокойном состоянии он будет показывать обычное ускорение свободного падения на нашей планете, что соответствует примерно 9,8 м/с². Но, если мы начнем двигать или вращать телефон, придадим ему ускорение. В результате в эти моменты датчик не будет давать необходимые показания. Только, когда мы прекратим движение, система успокоится, и мы сможем узнать силу, направленную к земле. Как видите, для того, чтобы просто определить положение телефона в пространстве, ни один из двух упомянутых нами датчиков не пригоден.

Однако, учитывая, что гироскоп «убегает» со временем, а акселерометр «убегает» только в момент вращения, можно вычислить положение устройства, применив различные математические методы, например, фильтр Калмана. Если вы программировали под Android, наверняка обращали внимание, что в самом Android SDK среди списка датчиков есть не только акселерометр и гироскоп, но и так называемый TYPE_ORIENTATION. Это как раз один из таких математических методов, вычисляющих положение телефона, используя информацию обоих датчиков. Сами они, как правило, собраны на одной микросхеме, очень часто на нее же дополнительно ставят датчик магнитного поля, то есть компас.

Те, кто интересуется квадрокоптерами, наверное, замечали, что на новых моделях появилась надпись «барометр». Очевидно, что предназначено это устройство не для анализа погоды. Такой датчик используется для измерения атмосферного давление с целью определения высоты. Так же оно работает и в телефоне, причем мы можем вычислять его перемещение по вертикальной оси с точностью до сантиметров. Естественно показания нужно сглаживать при помощи фильтра.

Практика


Google выпустил для своих устройств Cardboard и Daydream комплект Google VR SDK. Последний представляет собой набор компонентов, которые помогают нам разрабатывать приложения именно для отображения 3D-реальности, он доступен и на iOS, и на Android. Этот SDK позволяет с легкостью строить приложения и для виртуальной, и для дополненной реальности.

Google VR SDK берет на себя всю работу с датчиками, благодаря ему, нам не нужно вычислять кватернионы, чтобы понять, как повернуть сцену в OpenGL при повороте головы. Достаточно просто положить View на активити, и SDK сделает все самостоятельно.

Давайте бегло рассмотрим, как нам быстро начать работать с Google VR SDK и как создать простенькое приложение для Android. Во-первых, вам понадобится предустановленная Android Studio.
Сам SDK скачиваем из официального git-репозитория. Документация по SDK доступна здесь.

Теперь просто откройте корневую директорию репозитория при помощи Android Studio. Там вы сможете найти примеры, которые можно скомпилировать из исходников и запустить на вашем Android-устройстве. В проекте сразу есть конфигурации для запуска примеров.

3f8a213b91034f04823889399216c9b4.png

У Daydream есть и свой небольшой контроллер, работу с которым SDK также поддерживает. У него есть набор функций callback, и вы можете спокойно использовать этот контроллер в своих разработках. В SDK есть специальный пример 'sdk-controllerclient'.

Для максимально реалистичного восприятия хотелось бы ощутить и звук, причем так, чтобы было понятно, откуда он исходит, куда направлен и в какой среде распространяется. В библиотеке для этого есть GvrAudioEngine, который напоминает упрощенные Open Audio Library или Direct3D Sound. Достаточно сообщить координаты источника звука в пространстве, и библиотека сама смешает звук так, как вам нужно. Вы можете задавать различные материалы среды, можете, например, построить сцену, на которой из колонок справа и слева играет разная музыка, можете задать и больше источников звука.

Пример 'sdk-treasurehunt' представляет собой довольно простую игру, реализованную на чистом OpenGL. В ней также используется GvrAudioEngine для придания игре объемных звуковых эффектов.

Есть в Google VR SDK и замечательный, хоть и небольшой, набор вьюшек, которые можно встраивать в свои приложения. В частности, VrPanoramaView — компонент для отображения панорамных фотографии на 360 градусов, причем отображения стереографического. Фотографию можно просто положить в ресурсы приложения и буквально одной строчкой вызвать VrPanoramaView.loadImageFromBitmap (), чтобы взять именно эту картинку и отобразить ее. В итоге вы получите готовый компонент, который пользователь сможет увидеть в своем приложении — это обычная View, такая же, как и все остальные в Android.

Можно отобразить сразу несколько таких компонентов на одном экране, можно вывести один на полный экран, и при этом чтобы переключаться между очками и простым отображением, вам достаточно нажать на кнопку, которая будет нарисована библиотекой. Также есть возможность добавлять видео при помощи компонента VrVideoView. Причем если вам надоест смотреть какой-то момент, вы сможете видео перемотать.

Два семпла из SDK 'sdk-simplepanowidget' и 'sdk-simplevideowidget' показывают как совсем просто можно создать приложения с такими встроенными объектами.

Возникает вопрос, откуда взять такие видео и картинки? Но некоторые компании уже начали выпускать фотоаппараты в виде небольших брелоков, имеющие объективы с двух сторон. С их помощью можно сделать панорамные фотографии на 360 градусов — они даже самостоятельно могут их соединять —, но видео сделать не получится. Для этого понадобиться и довольно дорогая конструкция, и специальный софт, способный склеить полученные картинки и превратить их в контент, пригодный для отображения в виртуальной реальности.

e403dc124c71472b87b8229a150279c3.png

Решение Odyssey включает 16 синхронизированных камер.

Применение


Где можно применить описанные технологии? Первый вариант, очевидно, игры. Как правило, OpenGL — это шутеры и прочие игры, где нам необходимо восприятие глубины. Netflix недавно запустил сервис для отображения 3D-контента, эта библиотека тоже может помочь вам написать какое-нибудь собственное решение для отображения фильмов.

Можно дать возможность покупателям в магазине, используя телефоны, видеть рядом с ценниками товаров их дополнительное описание.

Применить их можно и в сфере продаж недвижимости. Покупателю и продавцу встречаться, как правило, неудобно. А с помощью такого видео покупателю будет гораздо проще заранее оценить, стоит ли ему вообще ехать смотреть тот или иной объект.

Еще одно идеальное место для применения технологии — музеи. В современных музеях, внутри зала часто стоят компьютеры, через которые можно получить доступ к дополнительной информации, что-то послушать. Но эти компьютеры регулярно бывают заняты, а телефон всегда под рукой у каждого, и он способен добавить к экспозиции элементы дополненной реальности. Библиотека будет работать практически с любой моделью устройства, и при желании мы сможем донести до посетителей музея больше информации.


Вот небольшой рекламный ролик Google, который демонстрирует, как выглядит Google Earth в очках виртуальной реальности. Такие видео вы можете посмотреть на обычном мониторе, но те же самые картинки в очках будут выглядеть объемными. Перемещение в пространстве осуществляется с помощью пульта от Daydream, также для некоторых телефонов есть возможность использовать барометр и перемещаться, просто вращая головой.

Другая очень интересная идея использования подобных технологий — 3D-печать.
Один стартап предложил пользователям прибегнуть к дополненной реальности для построения моделей вместе с любыми другими средствами моделирования. Используя обычный контроллер, нельзя получить модели высокой точности — погрешность будет очень большой. Но маленький сувенир мы с помощью таких контроллеров можем слепить и прямо из приложения заказать его печать на 3D-принтере. Идея эта хороша и монетизируется очень скоро, тем более, принтеры для подобных изделий постепенно дешевеют.

© Geektimes