IOS приложение для построения моделей объектов на основе 3D триангуляции Делоне в дополненной реальности
Обзор iOS приложений для построения 3D моделей реальных объектов. Выбор алгоритма 3D триангуляции Делоне на GPU. Описание алгоритма и логики реализации функционала приложения. Разработка gFlip3D, проверка на наличие конфигурации тетраэдров для флипа.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 10.12.2019 |
Размер файла | 5,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
3.3 Обмен данными между GPU и CPU
Буферы данных являются массивами данных. Каждый такой массив может содержать один тип данных, например float или int4. Стоит заметить, что копирование памяти буферов из пространства GPU в пространство CPU или обратно занимает относительно много времени, и может стать узким местом при работе с вычислительными шейдерами. Этого не избежать, но для того, чтобы смягчить эту проблему, можно оптимизировать код таким образом, чтобы минимизировать количество операций переноса данных между пространствами памяти [10].
Однако, так как мы запускаем шейдер на iOS устройстве, описанная выше проблема моментально перестает быть проблемой. Все устройства под управлением операционной системы iOS поддерживают модель унифицированной памяти [11] - центральный процессор и графический процессор совместно используют системную память. Такой режим управления памятью используется в iOS по умолчанию [12]. Схема использования общей системной памяти в iOS устройствах показана на рис. 9.
Рисунок 9. Схема использования памяти графическим и центральным процессорами в iOS устройствах [13]
3.4 Ядро
Ядром (англ. kernel) шейдера называется функция, которая может быть вызвана со стороны центрального процессора и будет выполняться в несколько потоков, число которых задается при вызове.
Для реализации алгоритма триангуляции был написан вычислительный шейдер, состоящий из нескольких ядер:
· FindLocations - Ядро для поиска индекса тетраэдра для каждой точки, внутри которого эта точка находится
· UpdateAdjacents - Ядро для определения соседства по грани между всеми тетраэдрами
· FindInserts - Ядро для определения точек для вставки в каждый тетраэдр на основе расстояний до центров описанных сфер
· InsertPoint - Ядро для вставки точек в тетраэдры
· FindFlips - Ядро для поиска конфигураций тетраэдров для выполнения флипов
· DoFlips - Ядро для выполнения флипов
Непосредственный вызов выполнения ядра производится с помощью вызова в C# коде функции Dispatch у объекта типа ComputeShader. Эта функция “запускает” вычислительный шейдер с указанным количеством групп потоков в измерениях X, Y и Z. Внутри каждой рабочей группы вызов выполняется в несколько потоков. Размер рабочей группы (количество потоков в каждом измерении в группе) указывается в HLSL коде вычислительного шейдера с помощью атрибута numthreads. Общее количество вызовов вычислительного шейдера равно числу групп, которое передается аргументами вызова Dispatch, умноженному на размер группы потоков. На рис. 10 показан пример вызова ядра kernel с количеством групп потоков 10, 20 и 1 в соответствующих измерениях.
Рисунок 10. Вызов ядра kernel с количеством групп потоков 10, 20, 1
Одним из аргументов функции вычислительного шейдера является идентификатор SV_DispatchThreadID текущего потока, состоящий из трех чисел - индексов текущего потока в каждом из трех измерений. Каждый индекс варьируется в диапазоне от 0 до произведения количества групп потоков, указанном при вызове Dispatch, на размер группы потоков, указанный атрибутом numthreads, в соответствующем измерении. Например, если вызывается Dispatch(10,20,1) для ядра с numthreads(8,8,1), SV_DispatchThreadID будет иметь диапазоны до 80, до 160 и до 1 для каждого измерения соответственно. Идентификатор потока позволяет понимать, с какими данными необходимо работать в каждом конкретном потоке.
3.5 Структуры данных
Вычислительный шейдер работает с буферами данных, указанными в табл. 1:
Таблица 1
Буферы данных
Название буфера |
Тип элементов |
Описание буфера |
|
vertices |
float3 (три числа типа float) |
Содержит координаты точек. |
|
tetrahedra |
int4 (четыре числа типа int) |
Тетраэдры, каждый тетраэдр описывается индексами четырех точек. |
|
facetsToCheck |
int |
Индексы тетраэдров для проверки на выполнение условия Делоне. |
|
location |
int |
i-ый элемент равен индексу тетраэдра, внутри которого находится точка с индексом i. |
|
distances |
float |
После выбора лучшей точки для вставки в тетраэдр с индексом i, i-ый элемент равен расстоянию от этой точки до центра сферы, описанной около тетраэдра с индексом i.i-ый элемент будет иметь значение -1, если в i-ом тетраэдре нет точек для вставки. |
|
insert |
int |
i-ый элемент равен индексу точки, которая будет вставлена в тетраэдр с индексом i.Если значение i-ого элемента равно -1, то в тетраэдр с индексом i не будет вставлена точка. |
|
pointsToInsert |
int |
Содержит индексы точек, которые еще не были вставлены в триангуляцию. |
|
adjacentTetrahedra |
int4 (четыре числа типа int) |
Пусть A - тетраэдр с индексом i, и Б - тетраэдр с индексом j. При этом А и Б имеют общую грань, которая не включает k-ую точку А (0 <= k <= 3). Тогда k-ое число i-ого элемента буфера равно j.Другими словами, k-ое число i-ого элемента является индексом тетраэдра Б, где k - номер точки в тетраэдре A, которая противолежит общей грани А и Б.Если тетраэдр Б не существует, то k-ое число i-ого элемента буфера равно -1.Пример:Если tetrahedra[6] = (10,3,12,13) и tetrahedra[7] = (10,12,13,20), тогда adjacentTetrahedra[6][1] = 7 |
|
flipWithTetrahedraAndPoint |
int3 (три числа типа int) |
i-ый элемент содержит конфигурацию для флипа, включающую тетраэдр с индексом i.Конфигурация описывается тремя числами j, k и u. Пусть А - тетраэдр с индексом i, а Б - тетраэдр с индексом j. u - индекс точки, которая принадлежит Б и противолежит общей грани тетраэдров А и Б.Если j равно -1, то конфигурация считается пустой.Если k равно -1, то предполагается выполнения флипа 2-3 (А и Б), иначе предполагается выполнения флипа 3-2 (А, Б и тетраэдр с индексом k). |
Буферы имеют счетчик, который может быть потокобезопасно увеличен или уменьшен на единицу, что позволяет работать с буфером, как со стеком. Эта возможность используется при создании новых тетраэдров в буфере tetrahedra в результате выполнения флипов, а также для добавления тетраэдров в буфер flipWithTetrahedraAndPoint.
Для получения корректных результатов работы ядер требуется выполнение некоторых условий, которые были соблюдены при написании C# кода. Для всех ядер обязательно выполнение двух условий перед их запуском: буферы tetrahedra и vertices не пусты и корректны. Далее в табл. 2 описаны дополнительные условия, которые соблюдаются перед запуском конкретных ядер, и изменения данных в результате работы ядер:
Таблица 2
Условия и последствия запуска ядер
Ядро |
Условия запуска |
Результат запуска |
|
FindLocations |
location заполнен “-1”, pointsToInsert содержит индексы точек, которые еще не были вставлены в триангуляцию |
location содержит актуальные значения для точек, индексы которых содержатся в pointsToInsert, и “-1” для остальных |
|
FindInserts |
insert и distances заполнены “-1”, location содержит актуальные значения для точек, которые еще не были вставлены в триангуляцию |
insert содержит актуальные индексы точек, для которых были известны тетраэдры в буфере location, и -1 для остальных |
|
InsertPoint |
insert содержит актуальные значения - индексы точек, которые будут вставлены в триангуляцию |
В буфер tetrahedra были добавлены новые тетраэдры, созданные в результате вставки точек (индексы которых содержатся в insert) в триангуляцию, а их индексы были добавлены в буфер facetsToCheck.Стоит заметить, что для каждой вставленной точки один из новых тетраэдров заменил тетраэдр в буфере tetrahedra, внутри которого находилась эта точка. |
|
UpdateAdjacents |
adjacentTetrahedra заполняется значениями (-1, -1, -1, -1) |
adjacentTetrahedra содержит актуальную информацию о соседстве тетраэдров |
|
FindFlips |
adjacentTetrahedra содержит актуальную информацию о соседстве тетраэдров; facetsToCheck содержит индексы тетраэдров для проверки условия Делоне; flipWithTetrahedraAndPoint заполняется значениями (-1, -1, -1) |
flipWithTetrahedraAndPoint содержит актуальные конфигурации для выполнения флипов с возможными конфликтами |
|
DoFlips |
flipWithTetrahedraAndPoint содержит актуальные конфигурации для выполнения флипов не конфликтующие друг с другом |
В буфер tetrahedra были добавлены тетраэдры, созданные в результате выполнения флипов, их индексы были добавлены в буфер facetsToCheck.Стоит заметить, что для каждого флипа 2-3 два старых тетраэдра в буфере tetrahedra были заменены новыми, а для каждого флипа 3-2 два тетраэдра были заменены двумя новыми, а третий заменен пустым тетраэдром (-1, -1, -1, -1). |
После вызова ядра FindFlips получаются конфигурации, которые потенциально конфликтуют друг с другом. Поэтому после вызова ядра FindFlips и перед вызовом ядра DoFlips происходит разрешение конфликтов конфигураций на CPU.
На рис. 11 показано ядро для определения индексов тетраэдров, внутри которых находятся точки для вставки.
Рисунок 11. Ядро для определения индексов тетраэдров, внутри которых находятся точки для вставки
На рис. 12 показана часть кода, выполняющая флип 2-3.
Рисунок 12. Реализация флипа 2-3
3.6 Краткое описание основных классов
ScanUIController - класс, который обрабатывает события взаимодействия пользователя с интерфейсом. А также обрабатывает события от других классов и отображает необходимый интерфейс.
BufferWrapper<T> - обертка над классом ComputeBuffer, позволяет более удобно работать с буферами данных.
ObjectScanSessionManager - класс, управляющий сессией фреймворка ARKit.
ObjectScanManager - класс, обрабатывающий события, получаемые от сессии фреймворка ARKit. Получает облако точек сканируемого объекта.
DelaunayBuilderGPU - класс, управляющий вычислительным шейдером, выполняет триангуляцию.
DelaunayVisualizer - класс, отображающий полученную модель объекта.
ObjExporter - класс, экспортирующий полученную модуль объекта в Obj файл.
TouchRotator - класс, обрабатывающий касания и позволяющий вращать объект.
TouchScaler - класс, обрабатывающий касания и позволяющий масштабировать объект.
TouchPlanePlacer - класс, обрабатывающий касания и позволяющий размещать объект на плоскости, определенной с помощью фреймворка ARKit.
3.7 Сохранение модели в OBJ файл
OBJ (или .OBJ) - это формат файла определения геометрии разработанный Wavefront Technologies. Формат файла OBJ представляет собой простой формат данных, который представляет только трехмерную геометрию, а именно: координаты текстуры UV для каждой вершины, нормали вершин и граней. Обязательной является только информация о вершинах и гранях. Данный формат представляет все данные в текстовом виде, что делает его легко читаемым для человека. На рис. 13 показан пример данных файла в формате OBJ, на нем перечислены вершины (строки, начинающиеся с “v”), нормали (строки, начинающиеся с “vn”), координаты текстуры (строки, начинающиеся с “vt”) и треугольники (строка, начинающаяся с “f”) модели.
Рисунок 13. Пример данных файла формата OBJ
На рис. 14 приведена часть кода, которая генерирует списки вершин, нормалей и граней (треугольников) модели объекта в формате OBJ.
Рисунок 14. Реализация генерации списка вершин, нормалей и граней модели объекта в формате OBJ
3.8 Получение облака точек
Сначала необходимо создать сессию ARKit, функция для создания сессии показа на рис. 15.
Рисунок 15. Создание ARKit сессии
Затем, когда пользователь нажмет кнопку сканирования точек, необходимо получить от ARKit данные о видимом объекте, функция, выполняющая это, показана на рис. 16.
Рисунок 16. Получение данных о видимом объекте
Функция AddPoints, показанная на рис. 17, добавляет в список всех отсканированных точек те, которые будут отданы ARKit в данный момент.
Рисунок 17. Добавление отсканированных точек в список
3.9 Взаимодействие с объектом в AR
Для того, чтобы перемещать объект, используется функция HitTest, которая позволяет узнать, не пересекается ли луч, выпущенный от камеры в направлении, соответствующем положению сильного нажатия экрана, с плоскостями, распознанными фреймворком ARKit. На рис. 18 приведена функция, которая проверяет пересечение с плоскостью, и, если оно есть, то перемещает объект в точку пересечения. Цикл foreach с вызовом return в теле использован вместо проверки размера массива hitResults и получения первого объекта из него.
Рисунок 18. Проверка пересечения луча, выпущенного камерой в направлении сильного нажатия по экрану, с плоскостью
Перемещение объекта в точку нажатия экрана реализовано с использованием технологии 3D Touch [14], которая позволяет узнать, насколько сильно пользователь нажимаем на экран. На рис. 19 показан фрагмент кода, который делает вызов функции HitTest (см. рис. 18) только тогда, когда сила нажатия составляет более 70% от максимальной распознаваемой устройством. Также для вызова функции HitTest создается объект типа ARPoint, соответствующий координатам касания экрана (каждая из координат которого имеет значение от 0 до 1).
Рисунок 19. Вызов функции HitSet при сильном нажатии
Масштабирование объекта сделано с помощью сравнения расстояния между двумя касаниями экрана в текущий момент времени относительно значений, сохраненных при предыдущей проверке. На рис. 20 показан код, который вычисляет изменение расстояния между двумя касаниями экрана и изменяет масштаб объекта соответственно.
Рисунок 20. Вычисление расстояния между двумя касаниями и изменение масштаба объекта соответственно
Руководство оператора по работе с программой приведено в Приложении Б.
Выводы по главе
В данной главе представлены инструменты разработки, описан принцип работы вычислительного шейдера; описаны все структуры данных и особенности реализации как алгоритма, так и взаимодействия с моделью в AR; описаны основные классы приложения.
Заключение
В результате выполнения всех задач было реализовано iOS приложение, которое на облаке точек реального объекта, отсканированного через камеру iPhone, на основе алгоритма 3D триангуляции Делоне gFlip3D получает триангулированную модель этого объекта. Построенную модель можно вывести в дополненную реальность и взаимодействовать с ней посредством касания экрана. Доступные действия: масштабирование, вращение и перемещение по плоскости, распознанной ARKit. Также модель можно сохранить в OBJ файл для дальнейшего просмотра или редактирования модели в специальных 3D редакторах, таких как, например, 3ds Max.
Путем дальнейшего развития приложения является получение облака точек более хорошего качества, сокращение времени построения модели, придание отдельным тетраэдрам модели цвета реального объекта, а также возможность редактирования модели прямо в приложении.
Список источников
1. Cao, T.-T. A GPU accelerated algorithm for 3D Delaunay triangulation / T.-T. Cao, A. Nanjappa, M. Gao, and T.-S. Tan // Proceedings of the 18th meeting of the ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games - New York, NY, USA: ACM - 2014 - С. 47-54.
2. Shewchuk, J. R. Star splaying: an algorithm for repairing Delaunay triangulations and convex hulls / J. R. Shewchuk // Proceedings of the 21st annual symposium on Computational Geometry - New York, NY, USA: ACM - 2005 - С. 237-246.
3. Lawson, C. L. Properties of n-dimensional triangulations / C. L. Lawson // Journal of Computer Aided Geometric Design - 1987 - vol. 3 - С. 231-246.
4. What's the Difference Between a CPU and a GPU? [Электронный ресурс] / NVIDIA. Режим доступа: https://blogs.nvidia.com/blog/2009/12/16/whats-the-difference-between-a-cpu-and-a-gpu, свободный. (дата обращения: 27.04.19)
5. Nanjappa, A. Delaunay triangulation in R3 on the GPU / A. Nanjappa // [Электронный ресурс]: ResearchGate, A thesis submitted for the degree of Doctor of Philosophy 2012. - Режим доступа: https://www.researchgate.net/publication/277571026_Delaunay_triangulation_in_R3_on_the_GPU, свободный. (дата обращения: 16.03.19)
6. ARKit vs ARCore - The Key Differences [Электронный ресурс] / New gen apps. Режим доступа: https://www.newgenapps.com/blog/arkit-vs-arcore-the-key-differences, свободный. (дата обращения: 27.04.19)
7. Рылина, В.О. Визуализатор алгоритма Делоне в трёхмерном пространстве: курсовая работа: защищена 18.04.2018; Национальный исследовательский университет Высшая школа экономики. - Москва, 2018.
8. Maur, P. Delaunay Triangulation in 3D / P. Maur // [Электронный ресурс]: DSpace, Technical Report 2002. - Режим доступа: https://dspace5.zcu.cz/bitstream/11025/21617/1/Maur.pdf, свободный. (дата обращения: 16.03.19).
9. Metal Shading Language Specification [Электронный ресурс] / Apple Developer. Режим доступа: https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf, свободный. (дата обращения: 20.04.19).
10. Getting Started with Compute Shaders in Unity [Электронный ресурс] / Kyle Halladay. Режим доступа: http://kylehalladay.com/blog/tutorial/2014/06/27/Compute-Shaders-Are-Nifty.html, свободный. (дата обращения: 20.05.19).
11. Metal Best Practices Guide [Электронный ресурс] / Apple Developer. Режим доступа: https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/ResourceOptions.html, свободный. (дата обращения: 21.05.19).
12. MTLResourceStorageModeShared - MTLResourceOptions [Электронный ресурс] / Apple Developer Documentation. Режим доступа: https://developer.apple.com/documentation/metal/mtlresourceoptions/mtlresourcestoragemodeshared?language=occ, свободный. (дата обращения: 21.05.19).
13. Working with memory in Metal [Электронный ресурс] / The Metal Framework. Режим доступа: http://metalkit.org/2017/04/30/working-with-memory-in-metal.html, свободный. (дата обращения: 21.05.19).
14. 3D Touch [Электронный ресурс] / Apple Developer. Режим доступа: https://developer.apple.com/ios/3d-touch/, свободный. (дата обращения: 21.05.19).
Размещено на Allbest.ru
...Подобные документы
Описание функциональной схемы цифрового устройства для реализации микроопераций. Выбор элементной базы для построения принципиальной электрической схемы цифрового устройства. Разработка и описание алгоритма умножения, сложения, логической операции.
курсовая работа [684,0 K], добавлен 28.05.2013Аналитический обзор ситуации на современном рынке мобильных приложений. Анализ приложений геолокации с социальным функционалом. Разработка мобильного приложения с интерактивной картой детских площадок под различные платформы или операционные системы.
реферат [4,2 M], добавлен 25.12.2015Разработка алгоритма нахождения оптимальной сети наземного цифрового телевизионного вещания. Программная реализация поиска точного решения задачи полным перебором множества проектов сетей. Обзор и схема коммуникационных операций типа точка-точка.
дипломная работа [1,3 M], добавлен 22.08.2016Принципы построения телефонных сетей. Разработка алгоритма обработки сигнальных сообщений ОКС№7 в сетях NGN при использовании технологии SIGTRAN. Архитектура сетей NGN и обоснованность их построения. Недостатки TDM сетей и предпосылки перехода к NGN.
дипломная работа [8,4 M], добавлен 02.09.2011Применение кондуктометрических датчиков. Описание построения основных узлов и блоков. Измерительная цепь уровнемера. Создание программы, обеспечивающей работу данного устройства под управлением микроконтроллера PIC16F876, разработка алгоритма и кода.
курсовая работа [366,2 K], добавлен 23.12.2012Разработка алгоритма функционирования устройства. Разработка и отладка рабочей программы на языке команд микропроцессора. Составление и описание электрической принципиальной схемы. Расчет АЧХ устройства для заданных и реальных значений коэффициентов.
курсовая работа [313,9 K], добавлен 28.11.2010Изучение основных принципов построения баз данных - именованной совокупности данных, отражающей состояние объектов и их отношений в рассматриваемой предметной области. Система управления базами данных. Концепции их построения и этапы проектирования.
контрольная работа [20,2 K], добавлен 14.12.2010Разность фаз между эталонным и исследуемым гармоническими сигналами. Выбор структуры автоматического фазометра. Расчет блока питания. Описание алгоритма программы для МК. Программа для МК. Описание алгоритма программы для ПК. Программа для ПК.
курсовая работа [101,2 K], добавлен 20.07.2010Критерий выбора проектных решений мест установки приёмных антенн навигационных систем. Построение алгоритма и математических моделей для оценки показателя эффективности принимаемых проектных решений. Схема для оценки экранирования навигационных спутников.
курсовая работа [498,8 K], добавлен 13.02.2013Понятие и задачи идентификации. Анализ аналитических и экспериментальных методов получения математических моделей технологических объектов управления. Формализация дискретных последовательностей операций (технологических циклов изготовления продукции).
курсовая работа [1,5 M], добавлен 06.12.2010Анализ вариантов подключения и построения контроллеров индикации на PIC микроконтроллерах. Проектирование модулей системной шины ISA. Разработка обобщенной схемы модуля. Методы построения алгоритмов инициализации и управления, разработка программы.
курсовая работа [574,7 K], добавлен 04.09.2012Изучение основ построения математических моделей сигналов с использованием программного пакета MathCad. Исследование моделей гармонических, периодических и импульсных радиотехнических сигналов, а также сигналов с амплитудной и частотной модуляцией.
отчет по практике [727,6 K], добавлен 19.12.2015Возможность выделения сигнальных признаков в приемниках обнаружения и сопровождения. Технические характеристики и аналитическое описание сигналов. Подбор математической модели алгоритма радиолокационного распознавания. Разработка программного продукта.
курсовая работа [415,8 K], добавлен 23.09.2011Описание алгоритма работы и разработка структурной схемы микропроцессорной системы управления. Разработка принципиальной схемы. Подключение микроконтроллера, ввод цифровых и аналоговых сигналов. Разработка блок-схемы алгоритма главной программы.
курсовая работа [3,3 M], добавлен 26.06.2016Методы определения пространственной ориентации вектора-базы. Разработка и исследование динамического алгоритма определения угловой ориентации вращающегося объекта на основе систем спутниковой навигации ГЛОНАСС (GPS). Моделирование алгоритма в MathCad.
дипломная работа [2,0 M], добавлен 11.03.2012Электронный замок: общая характеристика и принцип действия. Анализ вариантов реализации устройства. Разработка алгоритма функционирования, структурной и электрической принципиальной схемы электронного замка. Блок-схема алгоритма работы программы.
курсовая работа [363,3 K], добавлен 10.05.2015Исследование характеристик минимально-фазового объекта управления. Принцип построения дискретной модели. Расчёт регулятора компенсационного типа. Моделирование непрерывных объектов управления. Синтез безинерционного звена, выбор резисторов и конденсатора.
дипломная работа [5,8 M], добавлен 27.02.2012Принципы построения структурированных кабельных систем. Разработка схемы подключения в пакете Cisco Packet Tracer, обзор стандартов. Построение локальной вычислительной сети административного здания. Современные методы построения и создания сети.
контрольная работа [300,6 K], добавлен 16.02.2016Решение задачи компоновки для функциональной схемы с использованием последовательного алгоритма, пошаговое описание алгоритма. Размещение элементов в принципиальной электрической схеме. Трассировка цепей питания и земли с помощью волновых алгоритмов.
курсовая работа [1,1 M], добавлен 19.06.2010Описание принципа действия аналогового датчика и выбор его модели. Выбор и расчет операционного усилителя. Принципа действия и выбор микросхемы аналого-цифрового преобразователя. Разработка алгоритма программы. Описание и реализация выходного интерфейса.
курсовая работа [947,1 K], добавлен 04.02.2014