Пространственное сопоставление в Unity

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

Unity включает полную поддержку пространственного сопоставления, которое предоставляется разработчикам следующими способами:

  1. Компоненты пространственного сопоставления, доступные в Микседреалититулкит, которые предоставляют удобный и быстрый путь для начала работы с пространственным сопоставлением.
  2. API-интерфейсы пространственного сопоставления нижнего уровня, обеспечивающие полный контроль и обеспечивающие более сложную настройку для конкретного приложения.

Чтобы использовать пространственное сопоставление в приложении, в AppxManifest необходимо задать возможность Спатиалперцептион.

Поддержка устройств

Компонент HoloLens (первый общий) HoloLens 2 Иммерсивные гарнитуры
пространственное сопоставление ✔️ ✔️

Настройка возможности Спатиалперцептион

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

Как включить функцию Спатиалперцептион:

  1. в редакторе Unity откройте область "Параметры проигрывателя" (измените > Project Параметры > Player).
  2. выберите на вкладке "хранилище Windows" .
  3. разверните узел "публикация Параметры" и проверьте возможность "спатиалперцептион " в списке "возможности" .

Примечание

если проект Unity уже экспортирован в Visual Studio решение, необходимо либо экспортировать в новую папку, либо вручную установить эту возможность в AppxManifest в Visual Studio.

Для пространственного сопоставления также требуется Maxversiontested укажите установленную по меньшей мере 10.0.10586.0:

  1. в Visual Studio щелкните правой кнопкой мыши Package. appxmanifest в обозреватель решений и выберите команду просмотреть код .
  2. Найдите строку с указанием TargetDeviceFamily и измените maxversiontested укажите установленную = "10.0.10240.0" на maxversiontested укажите установленную = "10.0.10586.0" .
  3. Сохраните пакет. appxmanifest.

Добавление сопоставления в Unity

Система отслеживания пространственного положения.

В МРТК ознакомьтесь с руководством по началу работы с пространственными сведениями о настройке различных наблюдателей пространственной сетки.

Сведения об наблюдателях, посвященных устройствам, см. в разделе Настройка наблюдателей сетки для устройства .

Сведения об аспектах, посвященных наблюдателям, см. в разделе понятие сцены наблюдателя .

Анализ сетки более высокого уровня: пространственное понимание

Внимание!

Пространственное понимание является нерекомендуемым в пользу представления сцены.

Микседреалититулкит — это набор служебного кода для holographic-интерфейсов, созданных на основе более holographic-API Unity.

Пространственное понимание

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

Во время разработки Конкер и фрагментов асобо Studios столкнулись с этой проблемой, разрабатывая Поиск решения для комнаты. Каждая из этих игр имела потребность в конкретных играх, но они являются общими ключевыми технологиями для пространственного понимания. Библиотека Холотулкит. Спатиалундерстандинг инкапсулирует эту технологию, позволяя быстро находить пустые пробелы в стенах, размещать объекты в самом потолке, указывать место для размещения символа и множество других пространственных запросов.

Весь исходный код включен, что позволяет настроить его в своих целях и поделиться изменениями с сообществом. Код для поиска решения C++ был заключен в библиотеку DLL UWP и предоставлен в Unity с помощью Drop в prefab, который содержится в Микседреалититулкит.

Основные сведения о модулях

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

Приведение лучей

После завершения просмотра комнаты Метки создаются на внутреннем уровне для таких поверхностей, как этаж, потолк и стенки. PlayspaceRaycastФункция принимает луч и возвращает, если луч конфликтует с известной поверхностью и, если да, сведения об этой поверхности в виде RaycastResult .

struct RaycastResult
{
    enum SurfaceTypes
    {
        Invalid,    // No intersection
        Other,
        Floor,
        FloorLike,  // Not part of the floor topology,
                    //  but close to the floor and looks like the floor
        Platform,   // Horizontal platform between the ground and
                    //  the ceiling
        Ceiling,
        WallExternal,
        WallLike,   // Not part of the external wall surface,
                    //  but vertical surface that looks like a
                    //  wall structure
    };
    SurfaceTypes SurfaceType;
    float SurfaceArea;  // Zero if unknown
                        //  (i.e. if not part of the topology analysis)
    DirectX::XMFLOAT3 IntersectPoint;
    DirectX::XMFLOAT3 IntersectNormal;
};

На внутреннем уровне райкаст выдается по сравнению с вычисленным Воксел представлением плайспаце в Кубе 8 – cm. Каждый Воксел содержит набор элементов Surface с обработанными данными топологии (то есть сурфелс). Сурфелс, содержащийся в пересеченной ячейке Воксел, сравнивается с лучшим соответствием, используемым для поиска сведений о топологии. Данные топологии содержат метки, возвращаемые в форме перечисления "Сурфацетипес", а также контактную зону для пересекающейся поверхности.

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

Тип поверхности помечен рядом с курсором
Тип поверхности помечен рядом с курсором

Запросы топологии

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

Примечание

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

Подмножество запросов, предоставляемых диспетчером топологии, предоставляется через библиотеку DLL. Доступны следующие запросы топологии.

QueryTopology_FindPositionsOnWalls
QueryTopology_FindLargePositionsOnWalls
QueryTopology_FindLargestWall
QueryTopology_FindPositionsOnFloor
QueryTopology_FindLargestPositionsOnFloor
QueryTopology_FindPositionsSittable

Каждый запрос имеет набор параметров, относящихся к типу запроса. В следующем примере пользователь указывает минимальную высоту, & ширину требуемого тома, минимальную высоту размещения выше пола и минимальный размер зазора перед томом. Все измерения задаются в метрах.

EXTERN_C __declspec(dllexport) int QueryTopology_FindPositionsOnWalls(
    _In_ float minHeightOfWallSpace,
    _In_ float minWidthOfWallSpace,
    _In_ float minHeightAboveFloor,
    _In_ float minFacingClearance,
    _In_ int locationCount,
    _Inout_ Dll_Interface::TopologyResult* locationData)

Каждый из этих запросов принимает предварительно выделенный массив структур "Топологиресулт". Параметр "Локатионкаунт" задает длину переданного массива. Возвращаемое значение сообщает о количестве возвращенных расположений. Это число никогда не превышает значение, переданное параметром "Локатионкаунт".

"Топологиресулт" содержит центральную точку возвращенного тома, направление (то есть нормальное) и размеры найденного пространства.

struct TopologyResult
{
    DirectX::XMFLOAT3 position;
    DirectX::XMFLOAT3 normal;
    float width;
    float length;
};

Примечание

В примере Unity каждый из этих запросов связан с кнопкой на панели виртуального интерфейса. Пример жестко кодирует параметры для каждого из этих запросов в разумные значения. Дополнительные примеры см. в разделе Спацевисуализер. cs в примере кода.

Запросы фигур

В библиотеке DLL анализатор форм ("ShapeAnalyzer_W") использует анализатор топологии для сопоставления с пользовательскими фигурами, определенными пользователем. Образец Unity определяет набор фигур и предоставляет результаты из меню запросов в приложении на вкладке Shape. Цель состоит в том, что пользователь может определить собственные запросы фигур объектов и использовать их в соответствии с потребностями приложения.

Анализ фигур работает только на горизонтальных поверхностях. Например, диван определяется поверхностью плоского места и плоской вершиной на диване. Запрос Shape выполняет поиск двух поверхностей определенного размера, высоты и пропорций, при этом две поверхности Выровняйте и соединены. Используя терминологию API, место в диване и задняя часть являются компонентами фигур, а требования к выравниванию — к ограничениям компонентов.

Пример запроса, определенный в примере Unity (Шапедефинитион. cs) для объектов "ситтабле", выглядит следующим образом.

shapeComponents = new List<ShapeComponent>()
{
    new ShapeComponent(
        new List<ShapeComponentConstraint>()
        {
            ShapeComponentConstraint.Create_SurfaceHeight_Between(0.2f, 0.6f),
            ShapeComponentConstraint.Create_SurfaceCount_Min(1),
            ShapeComponentConstraint.Create_SurfaceArea_Min(0.035f),
        }
    ),
};
AddShape("Sittable", shapeComponents);

Каждый запрос Shape определяется набором компонентов Shape, каждый из которых имеет набор ограничений компонента и набор ограничений фигуры, в котором перечисляются зависимости между компонентами. Этот пример включает три ограничения в определении одного компонента и не имеет ограничений фигур между компонентами (как и один компонент).

Напротив, фигура дивана имеет два компонента фигур и четыре ограничения фигуры. Компоненты определяются по индексу в списке компонентов пользователя (в этом примере 0 и 1).

shapeConstraints = new List<ShapeConstraint>()
{
    ShapeConstraint.Create_RectanglesSameLength(0, 1, 0.6f),
    ShapeConstraint.Create_RectanglesParallel(0, 1),
    ShapeConstraint.Create_RectanglesAligned(0, 1, 0.3f),
    ShapeConstraint.Create_AtBackOf(1, 0),
};

Функции-оболочки предоставляются в модуле Unity для простого создания пользовательских определений фигур. Полный список ограничений для компонентов и фигур можно найти в "Спатиалундерстандингдлл. cs" в структурах "Шапекомпонентконстраинт" и "Шапеконстраинт".

Фигура прямоугольника находится на этой поверхности
Фигура прямоугольника находится на этой поверхности

Поиск решения о размещении объектов

Поиск по месту размещения объектов можно использовать для обнаружения идеального расположения в физической комнате для размещения объектов. Поиск решения позволяет найти оптимальное расположение с учетом правил и ограничений объекта. Кроме того, запросы объектов сохраняются до тех пор, пока объект не будет удален с помощью вызовов "Solver_RemoveObject" или "Solver_RemoveAllObjects", что позволяет ограничить размещение нескольких объектов. Запросы размещения объектов состоят из трех частей: тип размещения с параметрами, список правил и список ограничений. Чтобы выполнить запрос, используйте следующий API.

public static int Solver_PlaceObject(
            [In] string objectName,
            [In] IntPtr placementDefinition,        // ObjectPlacementDefinition
            [In] int placementRuleCount,
            [In] IntPtr placementRules,             // ObjectPlacementRule
            [In] int constraintCount,
            [In] IntPtr placementConstraints,       // ObjectPlacementConstraint
            [Out] IntPtr placementResult)

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

public enum PlacementType
{
    Place_OnFloor,
    Place_OnWall,
    Place_OnCeiling,
    Place_OnShape,
    Place_OnEdge,
    Place_OnFloorAndCeiling,
    Place_RandomInAir,
    Place_InMidAir,
    Place_UnderFurnitureEdge,
};

Каждый из типов размещения имеет набор параметров, уникальных для данного типа. Структура "Обжектплацементдефинитион" содержит набор статических вспомогательных функций для создания этих определений. Например, чтобы найти место для размещения объекта в этаже, можно использовать следующую функцию. общедоступная статическая Обжектплацементдефинитион Create_OnFloor (Vector3 Халфдимс) в дополнение к типу размещения можно предоставить набор правил и ограничений. Правила не могут быть нарушены. Возможные расположения размещения, которые соответствуют типу и правилам, оптимизируются по набору ограничений, чтобы выбрать оптимальное расположение размещения. Каждое из правил и ограничений можно создать с помощью предоставленных статических функций создания. Ниже приведен пример функции конструирования правила и ограничения.

public static ObjectPlacementRule Create_AwayFromPosition(
    Vector3 position, float minDistance)
public static ObjectPlacementConstraint Create_NearPoint(
    Vector3 position, float minDistance = 0.0f, float maxDistance = 0.0f)

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

List<ObjectPlacementRule> rules =
    new List<ObjectPlacementRule>() {
        ObjectPlacementRule.Create_AwayFromOtherObjects(1.0f),
    };

List<ObjectPlacementConstraint> constraints =
    new List<ObjectPlacementConstraint> {
        ObjectPlacementConstraint.Create_NearCenter(),
    };

Solver_PlaceObject(
    “MyCustomObject”,
    new ObjectPlacementDefinition.Create_OnEdge(
        new Vector3(0.25f, 0.25f, 0.25f),
        new Vector3(0.25f, 0.25f, 0.25f)),
    rules.Count,
    UnderstandingDLL.PinObject(rules.ToArray()),
    constraints.Count,
    UnderstandingDLL.PinObject(constraints.ToArray()),
    UnderstandingDLL.GetStaticObjectPlacementResultPtr());

В случае успешного выполнения возвращается структура "Обжектплацементресулт", содержащая положение, размеры и ориентацию размещения. Кроме того, размещение добавляется в внутренний список размещенных объектов библиотеки DLL. При последующих запросах на размещение этот объект учитывается. Файл "Левелсолвер. cs" в образце Unity содержит дополнительные примеры запросов.

Результаты размещения объектов
Рис. 3. синий прямоугольник, посвященный результату из трех мест в запросах к этаже от правил размещения камеры

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

Процесс сканирования комнаты

хотя решение для пространственного сопоставления, предоставляемое HoloLens, предназначено для удовлетворения потребностей всего спектра проблемных пространств, модуль пространственного понимания был разработан для поддержки потребностей двух конкретных игр. Его решение структурировано на основе определенного процесса и набора допущений, приведенных ниже.

Fixed size playspace – The user specifies the maximum playspace size in the init call.

One-time scan process –
    The process requires a discrete scanning phase where the user walks around,
    defining the playspace.
    Query functions will not function until after the scan has been finalized.

Пользователь, плайспаце "Рисование" — на этапе сканирования пользователь перемещает и просматривает темпы воспроизведения, эффективно рисуя области, которые должны быть добавлены. Созданная сетка важна для предоставления отзывов пользователей на этом этапе. Настройка домашних и офисных задвижок — функции запросов разрабатываются вокруг плоских поверхностей и стен в правой части. Это мягкое ограничение. Однако на этапе сканирования выполняется анализ основной оси для оптимизации тесселяции сетки вдоль основной и вспомогательной осей. Включаемый файл Спатиалундерстандинг. CS управляет процессом этапа сканирования. Он вызывает следующие функции.

SpatialUnderstanding_Init – Called once at the start.

GeneratePlayspace_InitScan – Indicates that the scan phase should begin.

GeneratePlayspace_UpdateScan_DynamicScan –
    Called each frame to update the scanning process. The camera position and
    orientation is passed in and is used for the playspace painting process,
    described above.

GeneratePlayspace_RequestFinish –
    Called to finalize the playspace. This will use the areas “painted” during
    the scan phase to define and lock the playspace. The application can query
    statistics during the scanning phase as well as query the custom mesh for
    providing user feedback.

Import_UnderstandingMesh –
    During scanning, the “SpatialUnderstandingCustomMesh” behavior provided by
    the module and placed on the understanding prefab will periodically query the
    custom mesh generated by the process. In addition, this is done once more
    after scanning has been finalized.

Поток сканирования, управляемый поведением "Спатиалундерстандинг", вызывает Инитскан, а затем Упдатескан каждый кадр. Когда статистический запрос сообщает о разумном покрытии, пользователю разрешается аиртап вызывать Рекуестфиниш, чтобы обозначить окончание этапа сканирования. Упдатескан будет вызываться до тех пор, пока его возвращаемое значение не обозначает, что библиотека DLL завершила обработку.

Общие сведения о сетке

Внутренняя библиотека DLL сохраняет плайспаце в виде сетки с 8 вокселными кубами cm. Во время первой части сканирования выполняется анализ основных компонентов, чтобы определить оси комнаты. На внутреннем уровне он хранит свое Воксел пространство, выравниваемая по этим осям. Сетка создается приблизительно каждую секунду путем извлечения isosurface из тома Воксел.

Созданная Сетка создана на основе тома Воксел
Созданная Сетка создана на основе тома Воксел

Устранение неполадок

  • Убедитесь, что вы установили функцию спатиалперцептион
  • При потере отслеживания следующее событие Онсурфацечанжед удалит все сетки.

пространственное сопоставление в смешанной реальности набор средств

дополнительные сведения об использовании пространственного сопоставления с набор средств смешанной реальности см. в разделе о поддержке пространственных данных в документах мртк.

Следующий этап разработки

Если вы пойдете из пути разработки Unity, мы собрались, что вы в состоянии изучить стандартные блоки МРТК Core. Отсюда вы можете перейти к следующему стандартному блоку:

Или перейдите к возможностям и API платформы смешанной реальности:

Вы можете в любой момент вернуться к этапам разработки для Unity.

См. также раздел