Пример использования. расширение возможностей пространственных сопоставлений HoloLensCase study - Expanding the spatial mapping capabilities of HoloLens

При создании наших первых приложений для Microsoft HoloLens мы затронули, насколько проводилась бы возможность отправки на устройстве границ пространственного сопоставления.When creating our first apps for Microsoft HoloLens, we were eager to see just how far we could push the boundaries of spatial mapping on the device. Джефф Евертт, инженер по программному обеспечению в Microsoft Studios, объясняет, как была разработана новая технология, которая не требует большего контроля над тем, как голограммы помещаются в реальную среду пользователя.Jeff Evertt, a software engineer at Microsoft Studios, explains how a new technology was developed out of the need for more control over how holograms are placed in a user's real-world environment.

Примечание

В HoloLens 2 реализована новая сцена, посвященная среде выполнения, которая предоставляет разработчикам смешанной реальности доступ к структурированному, высокоуровневой представлению среды, предназначенному для упрощения разработки приложений, поддерживающих среду.HoloLens 2 implements a new Scene Understanding Runtime, that provides Mixed Reality developers with a structured, high-level environment representation designed to make developing for environmentally aware applications intuitive.

Просмотреть видеоWatch the video

За пределами пространственного сопоставленияBeyond spatial mapping

Несмотря на то, что мы работаем над фрагментами и конкерами, два из первых игр для HoloLens, мы обнаружили, что при выполнении процедурного размещения голограмм в физическом мире нам требовалось более высокий уровень понимания среды пользователя.While we were working on Fragments and Young Conker, two of the first games for HoloLens, we found that when we were doing procedural placement of holograms in the physical world, we needed a higher level of understanding about the user's environment. Каждая игра имеет свои собственные требования к размещению: в фрагментах, например, мы хотели иметь возможность отличать различные поверхности, например этаж или таблицу, чтобы разместить подсказки в соответствующих расположениях.Each game had its own specific placement needs: In Fragments, for example, we wanted to be able to distinguish between different surfaces—such as the floor or a table—to place clues in relevant locations. Нам также хотелось бы иметь возможность определять поверхности, на которых может находился жизненный размер, например диван или кресло.We also wanted to be able to identify surfaces that life-size holographic characters could sit on, such as a couch or a chair. В Титов Конкер мы хотели, чтобы Конкер и его соперники могли использовать порожденные поверхности в комнате проигрывателя как платформы.In Young Conker, we wanted Conker and his opponents to be able to use raised surfaces in a player's room as platforms.

Асобо Studios, наш партнер по разработке для этих игр, столкнулся с этой проблемой и создал технологию, расширяющую возможности пространственных сопоставлений HoloLens.Asobo Studios, our development partner for these games, faced this problem head-on and created a technology that extends the spatial mapping capabilities of HoloLens. С помощью этого можно анализировать комнату игрока и выявление таких поверхностей, как стены, таблицы, стулья и пол.Using this, we could analyze a player's room and identify surfaces such as walls, tables, chairs, and floors. Это также дает нам возможность оптимизироваться по набору ограничений, чтобы определить наилучшее размещение для holographic объектов.It also gave us the ability to optimize against a set of constraints to determine the best placement for holographic objects.

Код пространственного пониманияThe spatial understanding code

Мы заняли исходный код асобо и создали библиотеку, которая инкапсулирует эту технологию.We took Asobo's original code and created a library that encapsulates this technology. Microsoft и асобо теперь имеют открытый исходный код и делают его доступным в микседреалититулкит для использования в собственных проектах.Microsoft and Asobo have now open-sourced this code and made it available on MixedRealityToolkit for you to use in your own projects. Включается весь исходный код, позволяющий настроить его в своих целях и поделиться изменениями с сообществом.All the source code is included, allowing you to customize it to your needs and share your improvements with the community. Код для поиска решения C++ был заключен в библиотеку DLL UWP и предоставлен в Unity с помощью prefab, содержащегося в микседреалититулкит.The code for the C++ solver has been wrapped into a UWP DLL and exposed to Unity with a drop-in prefab contained within MixedRealityToolkit.

В примере Unity есть много полезных запросов, которые позволяют находить пустые пробелы в стенах, размещать объекты в самом потолке или в больших пространствах на этаже, обнаруживать места для символов и множество других пространственных сведений о запросах.There are many useful queries included in the Unity sample that will allow you to find empty spaces on walls, place objects on the ceiling or on large spaces on the floor, identify places for characters to sit, and a myriad of other spatial understanding queries.

Хотя решение для пространственного сопоставления, предоставляемое HoloLens, достаточно универсально для удовлетворения потребностей всего спектра проблемных пространств, модуль пространственного понимания был разработан для поддержки потребностей двух конкретных игр.While the spatial mapping solution provided by HoloLens is designed to be generic enough to meet the needs of the entire gamut of problem spaces, the spatial understanding module was built to support the needs of two specific games. Таким образом, его решение структурировано вокруг определенного процесса и набора допущений:As such, its solution is structured around a specific process and set of assumptions:

  • Фиксированный размер плайспаце : пользователь задает максимальный размер плайспаце в вызове init.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.
  • Управляемая пользователем плайспаце "Рисование" : на этапе сканирования пользователь перемещается и просматривает плайспаце, эффективно рисуя области, которые должны быть добавлены.User driven playspace “painting” : During the scanning phase, the user moves and looks around the playspace, effectively painting the areas which should be included. Созданная сетка важна для предоставления отзывов пользователей на этом этапе.The generated mesh is important to provide user feedback during this phase.
  • Домашняя страница и программа установки Office . функции запросов разрабатываются вокруг плоских поверхностей и стен в правой части.Indoors home or office setup : The query functions are designed around flat surfaces and walls at right angles. Это мягкое ограничение.This is a soft limitation. Однако на этапе сканирования выполняется анализ основной оси для оптимизации тесселяции сетки вдоль основной и вспомогательной осей.However, during the scanning phase, a primary axis analysis is completed to optimize the mesh tessellation along major and minor axis.

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

Когда вы загружаете модуль пространственного понимания, первое, что вы будете делать, — это сканирование пространства, поэтому все доступные поверхности, такие как пол, потолк и стены, определяются и помечаются меткой.When you load the spatial understanding module, the first thing you'll do is scan your space, so all the usable surfaces—such as the floor, ceiling, and walls—are identified and labeled. В процессе сканирования вы просматриваете комнату и зарисуете области, которые должны быть добавлены в сканирование.During the scanning process, you look around your room and "paint' the areas that should be included in the scan.

Сетка, видимая на этом этапе, является важной частью визуальной обратной связи, которая позволяет пользователям узнать, какие части комнаты сканируются.The mesh seen during this phase is an important piece of visual feedback that lets users know what parts of the room are being scanned. Библиотека DLL для модуля пространственного понимания внутренне сохраняет плайспаце в виде сетки 8cm Воксел Cubes.The DLL for the spatial understanding module internally stores the playspace as a grid of 8cm sized voxel cubes. Во время первой части сканирования выполняется анализ основных компонентов, чтобы определить оси комнаты.During the initial part of scanning, a primary component analysis is completed to determine the axes of the room. На внутреннем уровне он хранит свое Воксел пространство, выравниваемая по этим осям.Internally, it stores its voxel space aligned to these axes. Сетка создается приблизительно каждую секунду путем извлечения isosurface из тома Воксел.A mesh is generated approximately every second by extracting the isosurface from the voxel volume.

Сетка пространственных сопоставлений в белом и знакомство с плайспаце сеткой зеленым цветом

Сетка пространственных сопоставлений в белом и знакомство с плайспаце сеткой зеленым цветомSpatial mapping mesh in white and understanding playspace mesh in green

Прилагаемый файл SpatialUnderstanding.cs управляет процессом этапа сканирования.The included SpatialUnderstanding.cs file manages the scanning phase process. Он вызывает следующие функции:It calls the following functions:

  • SpatialUnderstanding_Init : вызывается один раз в начале.SpatialUnderstanding_Init : Called once at the start.
  • GeneratePlayspace_InitScan : указывает, что должна начаться фаза сканирования.GeneratePlayspace_InitScan : Indicates that the scan phase should begin.
  • GeneratePlayspace_UpdateScan_DynamicScan : вызывается каждый кадр для обновления процесса сканирования.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 : вызывается для завершения плайспаце.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 . во время сканирования поведение спатиалундерстандингкустоммеш , предоставляемое модулем и размещенное в понимании prefab, будет периодически запрашивать пользовательскую сетку, созданную процессом.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.

Поток сканирования, управляемый поведением спатиалундерстандинг , вызывает инитскан , а затем упдатескан каждый кадр.The scanning flow, driven by the SpatialUnderstanding behavior calls InitScan , then UpdateScan each frame. Когда статистический запрос сообщает о разумном покрытии, пользователь может аиртап вызвать рекуестфиниш , чтобы обозначить окончание этапа сканирования.When the statistics query reports reasonable coverage, the user can airtap to call RequestFinish to indicate the end of the scanning phase. Упдатескан будет вызываться до тех пор, пока не будет возвращено значение, указывающее, что библиотека DLL завершила обработку.UpdateScan continues to be called until it’s return value indicates that the DLL has completed processing.

ЗапросыThe queries

После завершения проверки вы сможете получить доступ к трем различным типам запросов в интерфейсе:Once the scan is complete, you'll be able to access three different types of queries in the interface:

  • Запросы топологии . это быстрые запросы, основанные на топологии сканируемой комнаты.Topology queries : These are fast queries that are based on the topology of the scanned room.
  • Запросы Shape . они используют результаты запросов топологии для поиска горизонтальных поверхностей, которые хорошо соответствуют определенным пользовательским фигурам.Shape queries : These utilize the results of your topology queries to find horizontal surfaces that are a good match to custom shapes that you define.
  • Запросы размещения объектов . это более сложные запросы, которые находят оптимальное расположение на основе набора правил и ограничений для объекта.Object placement queries : These are more complex queries that find the best-fit location based on a set of rules and constraints for the object.

В дополнение к трем основным запросам имеется интерфейс райкастинг, который можно использовать для извлечения типов областей с тегами, а также для копирования настраиваемой сетки комнаты ватертигхт.In addition to the three primary queries, there is a raycasting interface which can be used to retrieve tagged surface types and a custom watertight room mesh can be copied out.

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

В библиотеке DLL диспетчер топологии обрабатывает метки среды.Within the DLL, the topology manager handles labeling of the environment. Как упоминалось выше, большая часть данных хранится в сурфелс, которые содержатся в томе Воксел.As mentioned above, much of the data is stored within surfels, which are contained within a voxel volume. Кроме того, структура плайспацеинфос используется для хранения сведений о плайспаце, включая выравнивание по всему миру (Подробнее об этом ниже), этаж и высоту потолка.In addition, the PlaySpaceInfos structure is used to store information about the playspace, including the world alignment (more details on this below), floor, and ceiling height.

Эвристические методы используются для определения этажей, потолков и стен.Heuristics are used for determining floor, ceiling, and walls. Например, крупнейшим является самая крупная и меньшая горизонтальная поверхность с более чем одной контактной областью m2.For example, the largest and lowest horizontal surface with greater than 1 m2 surface area is considered the floor. Обратите внимание, что в процессе сканирования также используется путь к камере.Note that the camera path during the scanning process is also used in this process.

Подмножество запросов, предоставляемых диспетчером топологии, предоставляется через библиотеку DLL.A subset of the queries exposed by the Topology manager are exposed out through the DLL. Доступны следующие запросы топологии.The exposed topology queries are as follows:

  • QueryTopology_FindPositionsOnWallsQueryTopology_FindPositionsOnWalls
  • QueryTopology_FindLargePositionsOnWallsQueryTopology_FindLargePositionsOnWalls
  • QueryTopology_FindLargestWallQueryTopology_FindLargestWall
  • QueryTopology_FindPositionsOnFloorQueryTopology_FindPositionsOnFloor
  • QueryTopology_FindLargestPositionsOnFloorQueryTopology_FindLargestPositionsOnFloor
  • QueryTopology_FindPositionsSittableQueryTopology_FindPositionsSittable

Каждый запрос имеет набор параметров, относящихся к типу запроса.Each of the queries has a set of parameters, specific to the query type. В следующем примере пользователь указывает минимальную высоту, & ширину требуемого тома, минимальную высоту размещения выше пола и минимальный размер зазора перед томом.In the following example, the user specifies the minimum height & width of the desired volume, minimum placement height above the floor, and the minimum amount of clearance in front of the volume. Все измерения задаются в метрах.All measurements are in meters.

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)

Каждый из этих запросов принимает предварительно выделенный массив структур топологиресулт .Each of these queries takes a pre-allocated array of TopologyResult structures. Параметр локатионкаунт задает длину переданного массива.The locationCount parameter specifies the length of the passed-in array. Возвращаемое значение сообщает о количестве возвращенных расположений.The return value reports the number of returned locations. Это число никогда не превышает переданный параметр локатионкаунт .This number is never greater than the passed-in locationCount parameter.

Топологиресулт содержит центральную точку возвращенного тома, направление (то есть нормальное) и размеры найденного пространства.The TopologyResult contains the center position of the returned volume, the facing direction (i.e. normal), and the dimensions of the found space.

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

Обратите внимание, что в примере Unity каждый из этих запросов связан с кнопкой на панели виртуального интерфейса.Note that in the Unity sample, each of these queries is linked up to a button in the virtual UI panel. Пример жестко кодирует параметры для каждого из этих запросов в разумные значения.The sample hard codes the parameters for each of these queries to reasonable values. Дополнительные примеры см. в разделе SpaceVisualizer.CS в примере кода.See SpaceVisualizer.cs in the sample code for more examples.

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

В библиотеке DLL анализатор форм ( ShapeAnalyzer_W ) использует анализатор топологии для сопоставления с пользовательскими фигурами, определенными пользователем.Inside of the DLL, the shape analyzer ( ShapeAnalyzer_W ) uses the topology analyzer to match against custom shapes defined by the user. Образец Unity имеет предварительно определенный набор фигур, которые отображаются в меню "запрос" на вкладке "Фигура".The Unity sample has a pre-defined set of shapes which are shown in the query menu, on the shape tab.

Обратите внимание, что анализ фигур работает только на горизонтальных поверхностях.Note that the shape analysis works on horizontal surfaces only. Например, диван определяется поверхностью плоского места и плоской вершиной на диване.A couch, for example, is defined by the flat seat surface and the flat top of the couch back. Запрос Shape выполняет поиск двух поверхностей определенного размера, высоты и пропорций, при этом две поверхности Выровняйте и соединены.The shape query looks for two surfaces of a specific size, height, and aspect range, with the two surfaces aligned and connected. Используя терминологию API, место дивана и вершина задней части дивана являются компонентами фигур, а требования к выравниванию — ограничения компонента.Using the APIs terminology, the couch seat and the top of the back of the couch are shape components and the alignment requirements are shape component constraints.

Пример запроса, определенный в примере Unity ( ShapeDefinition.CS ) для объектов "ситтабле", выглядит следующим образом:An example query defined in the Unity sample ( ShapeDefinition.cs ), for “sittable” objects is as follows:

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, каждый из которых имеет набор ограничений компонента и набор ограничений фигур, в котором перечисляются зависимости между компонентами.Each shape query is defined by a set of shape components, each with a set of component constraints and a set of shape constraints which lists dependencies between the components. Этот пример включает три ограничения в определении одного компонента и не имеет ограничений фигур между компонентами (так как существует только один компонент).This example includes three constraints in a single component definition and no shape constraints between components (as there is only one component).

Напротив, фигура дивана имеет два компонента фигур и четыре ограничения фигуры.In contrast, the couch shape has two shape components and four shape constraints. Обратите внимание, что компоненты определяются по индексу в списке компонентов пользователя (в этом примере 0 и 1).Note that components are identified by their index in the user’s component list (0 and 1 in this example).

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 для простого создания пользовательских определений фигур.Wrapper functions are provided in the Unity module for easy creation of custom shape definitions. Полный список ограничений для компонентов и фигур можно найти в SpatialUnderstandingDll.CS в структурах шапекомпонентконстраинт и шапеконстраинт .The full list of component and shape constraints can be found in SpatialUnderstandingDll.cs within the ShapeComponentConstraint and the ShapeConstraint structures.

Синий прямоугольник выделяет результаты запроса формы кресло.

Синий прямоугольник выделяет результаты запроса формы кресло.The blue rectangle highlights the results of the chair shape query.

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

Запросы на размещение объектов можно использовать для обнаружения идеального расположения в физической комнате для размещения объектов.Object placement queries can be used to identify ideal locations in the physical room to place your objects. Поиск решения позволяет найти оптимальное расположение с учетом правил и ограничений объекта.The solver will find the best-fit location given the object rules and constraints. Кроме того, запросы объектов сохраняются до тех пор, пока объект не будет удален с помощью Solver_RemoveObject или Solver_RemoveAllObjects вызовов, что позволяет ограничить размещение нескольких объектов.In addition, object queries persist until the object is removed with Solver_RemoveObject or Solver_RemoveAllObjects calls, allowing constrained multi-object placement.

Запросы размещения объектов состоят из трех частей: тип размещения с параметрами, список правил и список ограничений.Object placement queries consist of three parts: placement type with parameters, a list of rules, and a list of constraints. Чтобы выполнить запрос, используйте следующий API:To run a query, use the following 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)

Эта функция принимает имя объекта, определение размещения и список правил и ограничений.This function takes an object name, placement definition, and a list of rules and constraints. Оболочки C# предоставляют вспомогательные функции конструирования для упрощения создания правил и ограничений.The C# wrappers provide construction helper functions to make rule and constraint construction easy. Определение размещения содержит тип запроса, то есть один из следующих:The placement definition contains the query type — that is, one of the following:

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

Каждый из типов размещения имеет набор параметров, уникальных для данного типа.Each of the placement types has a set of parameters unique to the type. Структура обжектплацементдефинитион содержит набор статических вспомогательных функций для создания этих определений.The ObjectPlacementDefinition structure contains a set of static helper functions for creating these definitions. Например, чтобы найти место для размещения объекта в этаже, можно использовать следующую функцию:For example, to find a place to put an object on the floor, you can use the following function:

public static ObjectPlacementDefinition Create_OnFloor(Vector3 halfDims)

В дополнение к типу размещения можно предоставить набор правил и ограничений.In addition to the placement type, you can provide a set of rules and constraints. Правила не могут быть нарушены.Rules cannot be violated. Возможные расположения размещения, которые соответствуют типу и правилам, оптимизируются по набору ограничений, чтобы выбрать оптимальное расположение размещения.Possible placement locations that satisfy the type and rules are then optimized against the set of constraints to select the optimal placement location. Каждое из правил и ограничений можно создать с помощью предоставленных статических функций создания.Each of the rules and constraints can be created by the provided static creation functions. Ниже приведен пример функции конструирования правила и ограничения.An example rule and constraint construction function is provided below.

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

Приведенный ниже запрос размещения объекта ищет место для размещения полугодового Куба на границе поверхности, от других ранее размещенных объектов и вблизи центра комнаты.The object placement query below is looking for a place to put a half meter cube on the edge of a surface, away from other previously place objects and near the center of the room.

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());

В случае успешного выполнения возвращается структура обжектплацементресулт , содержащая положение размещения, размеры и ориентацию.If successful, an ObjectPlacementResult structure containing the placement position, dimensions and orientation is returned. Кроме того, размещение добавляется в внутренний список размещенных объектов библиотеки DLL.In addition, the placement is added to the DLL’s internal list of placed objects. При последующих запросах на размещение этот объект учитывается.Subsequent placement queries will take this object into account. Файл LevelSolver.CS в образце Unity содержит дополнительные примеры запросов.The LevelSolver.cs file in the Unity sample contains more example queries.

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

Синие поля показывают результат из трех мест в запросах этаже с правилами "от позиции камеры".The blue boxes show the result from three Place On Floor queries with "away from camera position" rules.

СоветыTips:

  • При решении для размещения нескольких объектов, необходимых для сценария уровня или приложения, сначала решите ненужные и крупные объекты, чтобы максимально увеличить вероятность того, что место может быть найдено.When solving for placement location of multiple objects required for a level or application scenario, first solve indispensable and large objects to maximize the probability that a space can be found.
  • Порядок размещения важен.Placement order is important. Если размещение объектов не найдено, попробуйте уменьшить количество ограниченных конфигураций.If object placements cannot be found, try less constrained configurations. Наличие набора резервных конфигураций крайне важно для поддержки функциональных возможностей во многих конфигурациях комнаты.Having a set of fallback configurations is critical to supporting functionality across many room configurations.

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

В дополнение к трем основным запросам можно использовать интерфейс приведения лучей, чтобы извлечь типы областей с тегами, а пользовательскую сетку ватертигхт плайспаце можно скопировать после того, как комната будет проверена и завершена, метки будут внутренне созданы для таких поверхностей, как этаж, потолк и стенки.In addition to the three primary queries, a ray casting interface can be used to retrieve tagged surface types and a custom watertight playspace mesh can be copied out After the room has been scanned and finalized, labels are internally generated for surfaces like the floor, ceiling, and walls. Функция плайспацерайкаст принимает луч и возвращает, если луч конфликтует с известной поверхностью и, если да, сведения об этой поверхности в форме райкастресулт .The PlayspaceRaycast function takes a ray and returns if the ray collides with a known surface and if so, information about that surface in the form of a 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;
     };

На внутреннем уровне райкаст вычисляются на основе вычисленного 8cm Куба Воксел представления плайспаце.Internally, the raycast is computed against the computed 8cm cubed voxel representation of the playspace. Каждый Воксел содержит набор элементов Surface с обработанными данными топологии (также известный как сурфелс).Each voxel contains a set of surface elements with processed topology data (also known as surfels). Сурфелс, содержащиеся в пересеченной ячейке Воксел, сравниваются с наиболее подходящим соответствием, используемым для поиска сведений о топологии.The surfels contained within the intersected voxel cell are compared and the best match used to look up the topology information. Данные топологии содержат метки, возвращаемые в форме перечисления сурфацетипес , а также контактную зону пересекающейся поверхности.This topology data contains the labeling returned in the form of the SurfaceTypes enum, as well as the surface area of the intersected surface.

В примере Unity курсор приводится к каждому кадру.In the Unity sample, the cursor casts a ray each frame. Во – первых, от своих противоречией Unity; Во вторых, для представления о мировом представлении модуля; и, наконец, для элементов пользовательского интерфейса.First, against Unity’s colliders; second, against the understanding module’s world representation; and finally, against the UI elements. В этом приложении пользовательский интерфейс получает приоритет, а затем понимает результат и, наконец, с помощью противоречащих Unity.In this application, UI gets priority, then the understanding result, and finally, Unity’s colliders. Сурфацетипе сообщается в виде текста рядом с курсором.The SurfaceType is reported as text next to the cursor.

Пересечение отчетов результатов райкаст с этажом.

Пересечение отчетов результатов райкаст с этажом.Raycast result reporting intersection with the floor.

Получите кодGet the code

Код с открытым кодом доступен в микседреалититулкит.The open-source code is available in MixedRealityToolkit. Если вы используете код в проекте, сообщите нам об этом на форумах разработчиков HoloLens .Let us know on the HoloLens Developer Forums if you use the code in a project. Мы не можем увидеть, что вы сделаете!We can't wait to see what you do with it!

Об автореAbout the author

Jeff Evertt, Software Engineering Lead at Microsoft Джефф евертт — это ведущий специалист по разработке программного обеспечения, который работал над HoloLens, начиная с первых дней, от руковожу группой создания до опыта разработки.Jeff Evertt is a software engineering lead who has worked on HoloLens since the early days, from incubation to experience development. До HoloLens он работал на Kinect Xbox и в отрасли игр на самых разных платформах и играх.Before HoloLens, he worked on the Xbox Kinect and in the games industry on a wide variety of platforms and games. Джефф имеет дело с автоматизированными, графическими объектами и объектами, с которыми поступают звуковые индикаторы.Jeff is passionate about robotics, graphics, and things with flashy lights that go beep. Он изучает новые вещи и работу с программным обеспечением, оборудованием и особенно в пространстве, где два пересекаются.He enjoys learning new things and working on software, hardware, and particularly in the space where the two intersect.

См. также статьюSee also