какойтокурсач. Факультет компьютерных технологий и прикладной математики Кафедра информационных технологий курсовая работа разработка мобильного приложения дополненной реальности для ос 10s с использованием платформы arkIT
Скачать 1.09 Mb.
|
1 2 ARkit2.1 Мультиплатформенная среда разработки Unity 2.1.1 Общие сведения о Unity Unity — это кроссплатформенный игровой движок, разработанный Unity Technologies, впервые анонсированный и выпущенный в июне 2005 года на Всемирной конференции разработчиков Apple Inc. в качестве эксклюзивного игрового движка для 0S Х. На момент 2018 года движок был расширен для поддержки 27 платформ. Unity дает пользователям возможность создавать игры как в 2D, так и в 3D, движок предлагает основной API для написания скриптов на С# как для редактора Unity в виде плагинов, так и для самих игр. 2.1.1 Возможности Редактор Unity имеет простой Drag&Drop интерфейс, который легко настраивать, состоящий из различных окон, благодаря чему можно производить отладку игры прямо в редакторе. Движок поддерживает С# в качестве скриптового языка. Расчёты физики производит физический движок Physx от NVIDIA. Проект в Unity делится на уровни, которые представлены отдельными файлами сцен, содержащие свои игровые миры со своим набором объектов, игровых сценариев, так называемые скрипты, и настроек. Сцены могут содержать в себе как объекты, содержащие модели, так и пустые игровые объекты. Они в свою очередь содержат наборы компонентов, с которыми и взаимодействуют скрипты. Также у объектов есть название, им возможно присвоить метку, так называемый тег, и слой, на котором он должен отображаться. Так, у любого объекта на сцене обязательно присутствует компонент Transform, который хранит в себе координаты местоположения, поворота и размеров объекта по всем трём осям. У объектов с видимой геометрией также по умолчанию присутствует компонент Mesh Renderer, делающий модель объекта видимой. К объектам можно добавлять такие компоненты, как коллайдеры (англ. collider), которые отвечают за параметры сталкивания объектов. Также Unity поддерживает физику твёрдых тел и ткани, а также физику типа Ragdoll (тряпичная кукла). В редакторе имеется система наследования объектов; дочерние объекты будут повторять все изменения позиции, поворота и масштаба родительского объекта. Скрипты в редакторе прикрепляются к объектам в виде отдельных компонентов. Редактор Unity поддерживает написание и редактирование шейдеров. Редактор Unity имеет компонент для создания анимации, но также анимацию можно создать предварительно в и импортировать вместе с моделью, а затем разбить на файлы. Unity 3D поддерживает систему Level 0f Detail (LOD), суть которой заключается в том, что на дальнем расстоянии от игрока высокодетализированные модели заменяются на менее детализированные, и наоборот, а также систему 0cclusion culling, суть которой в том, что у объектов, не попадающих в поле зрения камеры, не визуализируется геометрия и коллизия, что снижает нагрузку на центральный и графический процессоры и позволяет оптимизировать проект. При компиляции проекта создается исполняемый файл (*.ехе) игры, а в отдельной папке — данные игры, включая все игровые сцены и динамически подключаемые библиотеки. Движок поддерживает множество популярных форматов. Модели, звуки, текстуры, материалы, скрипты можно запаковывать в формат *.unityassets и передавать другим разработчикам или выкладывать в свободный доступ. Этот же формат используется во внутреннем магазине Unity Asset Store, в котором разработчики могут бесплатно или за деньги выкладывать в общий доступ различные элементы, нужные при создании игр. 2.1.3 Основные преимущества и недостатки Как правило, игровой движок предоставляет множество функциональных возможностей, позволяющих их задействовать в различных играх, в которые входят моделирование физических сред, карты нормалей, динамические тени и многое другое. В отличие от многих игровых движков, у Unity имеется два основных преимущества: наличие визуальной среды разработки и межплатформенная поддержка. Первый фактор включает не только инструментарий визуального моделирования, но и интегрированную среду, цепочку сборки, что направлено на повышение производительности разработчиков, в частности, этапов создания прототипов и тестирования. Под межплатформенной поддержкой предоставляется не только места развертывания, но и наличие инструментария разработки. Еще одним преимуществом является модульная система компонентов Unity, с помощью которой происходит конструирование игровых объектов, когда последние представляют собой комбинируемые пакеты функциональных элементов. В отличие от механизмов наследования, объекты в Unity создаются посредством объединения функциональных блоков, а не помещения в узлы дерева наследования. Такой подход облегчает создание прототипов, что актуально при разработке игр. В качестве недостатков приводятся ограничение визуального редактора при работе с многокомпонентными схемами, когда в сложных сценах визуальная работа затрудняется. Вторым недостатком является отсутствие поддержки в Unity ссылок на внешние библиотеки, работу с которыми программистам приходится настраивать самостоятельно; это также затрудняет командную работу. Ещё один недостаток связан с использованием шаблонов экземпляров (англ. prefabs). Также, движка, в силу специфики своей архитектуры (трансляция кода из С# в С++ и далее в JavaScript), имеет ряд нерешённых проблем с производительностью, потреблением памяти и работоспособностью на мобильных устройствах. 2.2 Платформа ARkit 2.2.1 Основная информация ARkit — это SDk (software development kit) для работы с дополненной реальностью, анонсированный компанией Арр1е на WWDC 2017 и полноценно представленный в возможностях iOS 11. Благодаря ему, порог вхождения в эту технологию AR стал значительно ниже. Основным требованием к любому и определяющим признаком ARkit является возможность создавать и отслеживать соответствие между реальным пространством, в котором живет пользователь, и виртуальным пространством, в котором вы можете моделировать визуальный контент. Когда ваше приложение отображает виртуальные объекты вместе с изображением с камеры в реальном времени, пользователь испытывает дополненную реальность: иллюзию того, что ваш виртуальный контент является частью реального мира. ARkit сочетает в себе отслеживание движения устройства, захват сцены с помощью камеры и расширенную обработку этой сцены, чтобы упростить задачу создания ARприложений. ARkit использует системы координат мира и камеры, в которой в качестве базиса используется правая тройка векторов. Так ось У направлена вверх, ось Z направлена на зрителя, а ось Х — вправо. Конфигурации сеансов могут изменить происхождение и ориентацию системы координат относительно реального мира. Каждый якорь (англ. anchor) в сеансе AR определяет свою собственную локальную систему координат, также основанную на правой тройке векторов. 2.2.1 Принцип отслеживания мира Чтобы создать соответствие между реальным и виртуальным пространством, ARkit использует технику, называемую визуальноинерциальную одометрию (англ. visual-inertial odometry). Этот процесс комбинирует информацию, полученную информацию с датчиков обнаружения движения устройства iOS, с анализом по средствам компьютерного зрения сцены, распознаваемой камерой устройства (рис. 4). ARkit распознает заметные особенности в изображении сцены, отслеживает различия в расположении этих объектов в видеокадрах и сравнивает эту информацию с данными о движении. В результате получается высокоточная модель положения и движения устройства в пространстве. Иными словами, происходит анализ полученного изображения под разными углами, когда устройство перемещается и переориентируется в физическом пространстве (требуется перемещение; вращение не дает достаточно информации). Изображения, полученные в этом процессе, используются вместе, чтобы понять глубину; больше это похоже на то, как люди воспринимают глубину двумя глазами Рисунок 4 Принцип отслеживания мира Это генерирует то, что Apple называет картой мира, которую можно использовать для позиционирования и ориентации объектов, применения к ним освещения и теней и многого другого. Чем больше пользователь перемещается и переориентируется, тем больше информации отслеживается и тем точнее и реалистичнее могут стать объекты дополненной реальности. Когда ARkit строит карту мира, он сопоставляет ее с виртуальным координатным пространством, в которое могут быть помещены объекты. Устройство нуждается в непрерывных данных датчика, и этот процесс лучше всего работает в хорошо освещенных средах, которые имеют текстурированные поверхности и очень четкие характеристики. ARkit отслеживает качество карты мира под капотом и указывает на одно из трех состояний, о которых разработчикам рекомендуется по-своему сообщать пользователям: недоступно: карта мира еще не построена; ограниченный: какой-то фактор помешал построить адекватную карту мира, поэтому функциональность и точность могут быть ограничены; З) обычный: карта мира достаточно надежна, чтобы можно было ожидать хорошего дополнения. Отслеживание мира также анализирует и понимает содержание сцены. Используйте методы проверки попадания, чтобы найти реальные поверхности, соответствующие точке на изображении с камеры. Если вы включите настройку Plane Detection в своей конфигурации сеанса, ARkit обнаружит плоские поверхности на изображении с камеры и сообщит об их положении и размерах. Вы можете использовать результаты теста на удар или обнаруженные плоскости для размещения или взаимодействия с виртуальным контентом в вашей сцене. 2.2.2 Основные возможности ARkit В данном разделе речь пойдет об основных возможностях ARkit, добавленных и функционирующих на момент декабря 2018 года. Основной функции рассматриваемого SDk, доступной на релизе, была возможность распознавания горизонтальных поверхностей (англ. Plane Detection). Функция обнаружения плоскостей использует карту мира для обнаружения поверхностей, на которых могут быть размещены объекты дополненной реальности. Когда ARkit был запущен, устройство могло распознавать и использовать только горизонтальные плоскости, а такие особенности поверхности, как выпуклости и изгибы, могли легко помешать попыткам точно разместить 3D-06RkT. На текущей момент существует возможность делать то же самое с вертикальными поверхностями и (в некоторой степени) с поверхностями произвольной формы, которые не являются полностью плоскими. Так же в ARkit 1.5 добавлено базовое отслеживание Это означает, что приложения ARkit могут распознавать что-то вроде страницы в книге, постера фильма или рисунка на стене. Разработчики могут легко заставить свои приложения вводить объекты в окружающую среду, как только устройство распознает эти В новой версии ARkit это функция также распространяется на трехмерные объекты (рис. 5). По сути, способ, которым приложение читает реальный трехмерный объект, похож на способ, которым он строит карты мира. Как и в случае с отслеживанием разработчики должны включить в приложение эталонный объект для сравнения с реальным объектом. Потенциальные применения этой функции многочисленны. ARkit может идентифицировать конкретную марку и модель автомобиля в реальном мире и разместить представление названия автомобиля и технические характеристики рядом с его местоположением в поле зрения пользователя. Рисунок 5 — Сканирование объекта Начиная с версии 2.0 появилась возможность сохранять карту окружения вместе с расставленными объектами дополненной реальности. Имея карту, можно инициализировать с помощью неё после чего ранее расставленные объекты появятся в нужных местах. Сохранённую карту также можно передать на сервер и использовать на других устройствах. Механизм сохранения карты окружения позволил синхронизировать систему координат между несколькими устройствами. Зная положение каждого из устройств относительно карты окружения, можно построить многопользовательские сценарии. Но многопользовательские игры не единственный возможный вариант использования. Помимо прочего, сохранение и загрузка карт может позволить разработчикам приложений создавать постоянные объекты в определенном месте, например, виртуальную статую на городской площади, которую все пользователи будут видеть в одном и том же месте при каждом посещении. Пользователи могут даже добавлять свои собственные объекты в мир, чтобы их могли найти другие пользователи. Наконец, ARkit 2 поддерживает расширенное текстурирование среды. Это означает несколько вещей. Во-первых, Apple утверждает, что она обучила нейронную сеть тысячам сред, что позволяет ARkit по существу галлюцинировать содержимое пробелов в сцене и карте мира с некоторой степенью точности. Текстурирование среды также позволяет более реалистично отображать объекты в контексте сцены. ARkit отслеживает окружающий свет в окружающей среде и генерирует тени от виртуальных объектов в поле зрения пользователя. Одно это закрывает большой пробел в том, как реальные пользователи могут воспринимать объект; Оказывается, объект, который не отбрасывает тень, портит наши головы. Он также применяет отражения окружающей среды к объектам, которые должны иметь их.Это еще один пробел для убедительного дополнения. З Программная реализация 3.1 Постановка задачи Программной реализацией будет являться мобильной приложение для операционной системы iOS, способное распознать плоскую поверхность и загрузить на ее виртуальный аналог произвольную предварительно сохраненных на смартфон посредствам функции iTunes «Общие файлы». Текущая версия приложения загружает модель, сохраненную по пути «/modell/scene.gltf». 3.2 Выбор платформы и языка программирования Платформой для разработки был выбран игровой движок Unity, благодаря наличию плагина для поддержки формата GLTF, возможности создания его мультиплатформенности, а также наличию бесплатной версии с достаточным для разработки функционалом и набором инструментов. Рисунок 6 — Интерфейс среды Unity В качестве языка программирования был выбран язык С# как основной скриптовый язык Unity. 3.3 Настройка среды Unity. Установка плагина Плагин UnityGLTF разделен на две части: решение Visual Studio GLTFSerializer и проект-пример Unity. Для корректной работы необходимо собрать эту библиотеку в папке Plugins основного проекта Unity, в котором идет разработка. Для этого нужно открыть GLTFSerialization.sln в Microsoft Visual Studio и скомпилировать его с настройкой компилятора Release и параметром командной строки -unsafe. Это поместит двоичные файлы в папку по пути «название основного После этого плагин будет внедрен в проект и его можно будет использовать. 3.4 Построение внутреигровой сцены Рассмотрим структуру внутреигровой сцены. На рисунке 7 справа изображена иерархия игровых объектов (англ. дате object). Объект Direktional light отвечает за параметры освещения и содержит вектор направления и положение источника света. Набор объектов CameraParent и Main Camera составляют виртуальную внутреигровую камеру. ARCameraManager и AR3DOFCameraManager обеспечивают корректное взаимодействие между аппаратным обеспечением смартфона, таким как цифровая камера и акселерометр, с виртуальной камерой. Объект PointCloud определяет множество точек реальной поверхности, а объект GeneratePlanes строит по ним виртуальную поверхность. Объект Canvas представляет собой холст экрана и содержит объекты интерфейса. EventSystem является стандартным объектом реализует систему событий, таких как нажатие на клавишу пользовательского интерфейса. HitCubeParent является на момент запуска программы пустым объектом, но после нажатия на кнопку «Start» ему присваивается объект-потомок Scene, содержащий загруженную 3Dмодель. File Edit Asset5 GameObject Component UniGlTF-1.20 Window HeIp Рисунок 7 Окно внутреигровой сцены 3.5 Результаты работы После запуска программа методом визуально-инерциальной одометрии определяет реальную поверхность, строя множество точек (рис. 9). Далее происходит построение виртуальной поверхности (рис. 10). после нажатия на кнопку «Start» происходит загрузка из памяти устройства и создается объект Scene, являющийся потомком HitCubeParent (рис. 8). При этом масштабируется и размещается на созданной виртуальной поверхности, создавая эффект дополненной реальности. File Edit Assets GameObject Component UniGLTF-1.20 Window Help PHCYHOK 8 — 3arpy3Ka MOAeJIH PHCYHOK 9 — BHPTyaJ1bHan 110BePXHOCTb Рисунок 10 — Загрузка ЗАКЛЮЧЕНИЕ В результате курсовой работы было проведено исследование технологии дополненной реальности и возможностей ее реализации с помощью ARkit, что позволило оценить то, насколько перспективным является это направление. Также был выполнен обзор возможностей игрового движка Unity, его преимуществ и недостатков; рассмотрен формат GLTF и его особенности. Основной трудностью, встреченной при сборе информации по теме, была нехватка либо полное отсутствие сведений на русском языке, так как данная область является передовой и быстро развивающейся. Основными источниками были тематические англоязычные порталы, статьи разработчиков и документация ПО. Результатом работы является разработка мобильного приложения для операционной системы iOS, способное распознать плоскую поверхность и загрузить на нее произвольную предварительно сохраненных на смартфон посредствам функции iTunes «Общие файлы». Одним из пунктов плана развития проекта на будущее является разработка подпрограммы с функцией локального файлового менеджера, которая позволит пользователю выбирать из нескольких сохраненных им в памяти устройства. На данный момент в приложении пока нет такой возможности, что с тем, что iOS имеет закрытую файловую систему и для реализации подобной опции необходима разработка отдельной подпрограммы. Также в дальнейшем планируется добавление возможности воспроизведения анимации для изменение размера модели и ее поворот вдоль оси во время работы программы, загрузка файла модели из облака и внедрение синхронизации мира для нескольких пользователей. CllHCOK HC110J1b30BAHHb1X HCTOLIHHKOB Benda P. , Ulman M. Augmented Reality As a Working Aid for Intellectually Disabled Persons For Work in Horticulture. URL https://www.researchgate.net/publication/298033889 Augmented Reality As a Working Aid for Intellectually Disabled Persons For Work in Horticult ure Linietsky Juan. A Small Defense Of GLTF 2.0 On Its Comparison Against Opengex. URL https://godotengine.org/article/small-defense-gltf Brainville Arthur. Why glTF 2.0 is awesome! URL https://dev.to/ybalrid/why-gltf-20-is-awesome-2khp GLTF Overview. URL https://www.khronos.org/gltf/ Understanding World Tracking in ARKitURL. https://developer.apple.com/documentation/arkit/understanding world trackin g in arkit Axon Samuel. How ARKit 2 works, and why Apple is so focused on AR. URL — https://arstechnica.com/gadgets/2018/06/arkit-2-why-apple-keepspushing-ar-and-how-it-works-in-ios- 12/ Ronald T. Azuma. A Survey of Augmented Reality. URL https://www.cs.unc.edu/—azuma/ARpresence.pdf Linietsky Juan. Why We Should All Support GLTF 2.0 As The Standard Asset Exchange Format For Game Engines. URL https://godotengine.org/article/we-should-all-use-gltf-20-export-3d-assetsgame-engines IIPHJIO)KEHHE ACKPHIIT 06pa60TKH KHOIIKH CTapT using Sy stem; using Sy stem .10; using System. Linq; using Sy stem. Text ; using UnityEngine; using UnityEngine . UI; using UnityEngine .XR . iOS; namespace UniGLTF public class GuiManager : MonoBehaviour [SerializeFieId] Button m_importButton; GameObject m_ root; void Start() m_importButton . onC1ick . Add Listener (OnC1ick) ; public void OnC1ick() UNITY EDITOR var path = "C : / Users/Kirse/Documents/Unity3D/bottigIia/ scene. gltf " ; #else var path = Application . persistentDataPath + " /modell/scene.gltf"; #endif Debug. Log( " path " ) ; if (string. IsNu110rEmpty(path)) return; if (m_ root != null) GameObject . Destroy (m_ root) ; m root = Load (path); mroot . transform. parent = GameObject . Find( " HitCubeParent " ) . transform; mroot . AddComponent GameObject Load (string path) var bytes = File. ReadAIIBytes(path); Debug. LogFormat(" [OnC1ick] {0}" , path) ; var context = new ImporterContext(); var ext = Path. GetExtension(path) . ToLower(); switch(ext) case " .gltf" : context . ParseJson (Encoding. UTF8. GetString(bytes) , new FileSystemStorage (Path . GetDirectoryName (path) ) ) ; break; case " . zip" var zipArchive=Zip.ZipArchiveStorage.Parse(bytes); var gltf = zipArchive.Entries. FirstOrDefau1t(x => x. FileName . ToLower() . EndsWith .gltf" ) ) ; if (gltf null) throw new Exception( "no gltf in archive"); var jsonBytes = zipArchive. Extract(gltf) ; var json = Encoding.UTF8.GetString(jsonBytes); context . ParseJson(json, zipArchive); break; case ' .glb" : context . ParseG1b( bytes) ; break; default : throw new Not ImplementedException(); gltflmporter. Load (context) ; context . Root. name = Path . GetFi1eNameWithoutExtension (path) ; context . ShowMeshes() ; return context. Root; PHCYHOK A. I — JIHCTHHE djparrvreHTa mporpaMMb1 1 2 |