Estudo de caso – expandindo os recursos de mapeamento espacial do HoloLensCase study - Expanding the spatial mapping capabilities of HoloLens

Ao criar nossos primeiros aplicativos para o Microsoft HoloLens, estamos ansiosos para ver a distância dos limites do mapeamento espacial no dispositivo.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. Jeff Evertt, engenheiro de software da Microsoft estúdios, explica como uma nova tecnologia foi desenvolvida fora da necessidade de mais controle sobre como os hologramas são colocados no ambiente real do usuário.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.

Observação

O HoloLens 2 implementa uma nova cena que entende o tempo de execução, que fornece aos desenvolvedores de realidade misturada uma representação de ambiente estruturada e de alto nível projetada para tornar o desenvolvimento para aplicativos com reconhecimento de ambiente intuitivo.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.

Assista ao vídeoWatch the video

Além do mapeamento espacialBeyond spatial mapping

Enquanto estávamos trabalhando em fragmentos e jovens conkers, dois dos primeiros jogos para o HoloLens, descobrimos que, ao fazer o posicionamento de procedimentos dos hologramas no mundo físico, precisávamos de um nível mais alto de compreensão sobre o ambiente do usuário.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. Cada jogo teve suas próprias necessidades de posicionamento específicas: em fragmentos, por exemplo, queríamos ser capaz de distinguir entre diferentes superfícies, como o piso ou uma tabela, para colocar pistas em locais relevantes.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. Também queríamos ser capazes de identificar superfícies em que os caracteres Holographic de tamanho de vida pudessem se sentar, como um sofá ou uma cadeira.We also wanted to be able to identify surfaces that life-size holographic characters could sit on, such as a couch or a chair. Em Conker jovem, queríamos que Conker e seus adversários consigam usar superfícies levantadas na sala de um jogador como plataformas.In Young Conker, we wanted Conker and his opponents to be able to use raised surfaces in a player's room as platforms.

Asobo estúdios, nosso parceiro de desenvolvimento para esses jogos, enfrentou esse problema e criou uma tecnologia que estende os recursos de mapeamento espacial do 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. Usando isso, poderíamos analisar a sala de um jogador e identificar superfícies como paredes, tabelas, cadeiras e andares.Using this, we could analyze a player's room and identify surfaces such as walls, tables, chairs, and floors. Ele também nos forneceu a capacidade de otimizar em relação a um conjunto de restrições para determinar o melhor posicionamento para objetos Holographic.It also gave us the ability to optimize against a set of constraints to determine the best placement for holographic objects.

O código de compreensão espacialThe spatial understanding code

Pegamos o código original de Asobo e criamos uma biblioteca que encapsula essa tecnologia.We took Asobo's original code and created a library that encapsulates this technology. A Microsoft e o Asobo agora têm o código-fonte aberto e disponibilizado no MixedRealityToolkit para você usar em seus próprios projetos.Microsoft and Asobo have now open-sourced this code and made it available on MixedRealityToolkit for you to use in your own projects. Todo o código-fonte está incluído, permitindo personalizá-lo às suas necessidades e compartilhar suas melhorias com a Comunidade.All the source code is included, allowing you to customize it to your needs and share your improvements with the community. O código para o resolvedor de C++ foi encapsulado em uma DLL UWP e exposto ao Unity com um pré-fabricado de distribuição contido no MixedRealityToolkit.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.

Há muitas consultas úteis incluídas no exemplo de Unity que permitirão que você encontre espaços vazios em paredes, coloque objetos no teto ou em espaços grandes no chão, identifique os locais para os caracteres a serem colocados e uma infinidade de outras consultas de compreensão espacial.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.

Embora a solução de mapeamento espacial fornecida pelo HoloLens seja projetada para ser genérica o suficiente para atender às necessidades de toda a gama de espaços problemáticos, o módulo de compreensão espacial foi criado para dar suporte às necessidades de dois jogos específicos.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. Dessa forma, sua solução é estruturada em um processo específico e um conjunto de suposições:As such, its solution is structured around a specific process and set of assumptions:

  • Tamanho fixo Playspace : o usuário especifica o tamanho máximo de Playspace na chamada de inicialização.Fixed size playspace : The user specifies the maximum playspace size in the init call.
  • Processo de verificação única : o processo requer uma fase de verificação discreta na qual o usuário percorra, definindo o Playspace.One-time scan process : The process requires a discrete scanning phase where the user walks around, defining the playspace. As funções de consulta não funcionarão até que a verificação seja finalizada.Query functions will not function until after the scan has been finalized.
  • Playspace controlado pelo usuário "pintando ": durante a fase de verificação, o usuário se move e procura o Playspace, pintando efetivamente as áreas que devem ser incluídas.User driven playspace “painting” : During the scanning phase, the user moves and looks around the playspace, effectively painting the areas which should be included. A malha gerada é importante para fornecer comentários do usuário durante essa fase.The generated mesh is important to provide user feedback during this phase.
  • Inportações domésticas ou de instalação do Office : as funções de consulta são projetadas em relação a superfícies simples e paredes em ângulos retos.Indoors home or office setup : The query functions are designed around flat surfaces and walls at right angles. Essa é uma limitação flexível.This is a soft limitation. No entanto, durante a fase de verificação, uma análise de eixo primário é concluída para otimizar o mosaico de malha ao longo do eixo principal e secundário.However, during the scanning phase, a primary axis analysis is completed to optimize the mesh tessellation along major and minor axis.

Processo de verificação de salaRoom Scanning Process

Ao carregar o módulo de compreensão espacial, a primeira coisa que você fará é digitalizar seu espaço, de modo que todas as superfícies utilizáveis — como piso, teto e paredes — sejam identificadas e rotuladas.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. Durante o processo de verificação, você examina sua sala e "pinta" as áreas que devem ser incluídas na verificação.During the scanning process, you look around your room and "paint' the areas that should be included in the scan.

A malha vista durante essa fase é uma parte importante dos comentários visuais que permite aos usuários saber quais partes da sala estão sendo examinadas.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. A DLL para o módulo de compreensão espacial armazena internamente o Playspace como uma grade de cubos VOXEL dimensionados 8cm.The DLL for the spatial understanding module internally stores the playspace as a grid of 8cm sized voxel cubes. Durante a parte inicial da verificação, uma análise de componente primário é concluída para determinar os eixos da sala.During the initial part of scanning, a primary component analysis is completed to determine the axes of the room. Internamente, ele armazena seu espaço VOXEL alinhado a esses eixos.Internally, it stores its voxel space aligned to these axes. Uma malha é gerada aproximadamente a cada segundo, extraindo o isosurface do volume VOXEL.A mesh is generated approximately every second by extracting the isosurface from the voxel volume.

Malha de mapeamento espacial em branco e entendendo a malha Playspace em verde

Malha de mapeamento espacial em branco e entendendo a malha Playspace em verdeSpatial mapping mesh in white and understanding playspace mesh in green

O arquivo SpatialUnderstanding.cs incluído gerencia o processo da fase de verificação.The included SpatialUnderstanding.cs file manages the scanning phase process. Ele chama as seguintes funções:It calls the following functions:

  • SpatialUnderstanding_Init : chamado uma vez no início.SpatialUnderstanding_Init : Called once at the start.
  • GeneratePlayspace_InitScan : indica que a fase de verificação deve começar.GeneratePlayspace_InitScan : Indicates that the scan phase should begin.
  • GeneratePlayspace_UpdateScan_DynamicScan : chamado cada quadro para atualizar o processo de verificação.GeneratePlayspace_UpdateScan_DynamicScan : Called each frame to update the scanning process. A posição e a orientação da câmera são passadas e são usadas para o processo de pintura Playspace, descrito acima.The camera position and orientation is passed in and is used for the playspace painting process, described above.
  • GeneratePlayspace_RequestFinish : chamado para finalizar o Playspace.GeneratePlayspace_RequestFinish : Called to finalize the playspace. Isso usará as áreas "pintadas" durante a fase de verificação para definir e bloquear o Playspace.This will use the areas “painted” during the scan phase to define and lock the playspace. O aplicativo pode consultar estatísticas durante a fase de verificação, bem como consultar a malha personalizada para fornecer comentários do usuário.The application can query statistics during the scanning phase as well as query the custom mesh for providing user feedback.
  • Import_UnderstandingMesh : durante a verificação, o comportamento de SpatialUnderstandingCustomMesh fornecido pelo módulo e colocado no pré-fabricado de compreensão consultará periodicamente a malha personalizada gerada pelo processo.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. Além disso, isso é feito mais uma vez após a verificação ter sido finalizada.In addition, this is done once more after scanning has been finalized.

O fluxo de verificação, orientado pelo comportamento SpatialUnderstanding , chama InitScan e, em seguida, UpdateScan cada quadro.The scanning flow, driven by the SpatialUnderstanding behavior calls InitScan , then UpdateScan each frame. Quando a consulta de estatísticas relata cobertura razoável, o usuário pode airtap chamar RequestFinish para indicar o fim da fase de verificação.When the statistics query reports reasonable coverage, the user can airtap to call RequestFinish to indicate the end of the scanning phase. UpdateScan continua sendo chamado até que o valor de retorno indique que a dll concluiu o processamento.UpdateScan continues to be called until it’s return value indicates that the DLL has completed processing.

As consultasThe queries

Quando a verificação for concluída, você poderá acessar três tipos diferentes de consultas na interface:Once the scan is complete, you'll be able to access three different types of queries in the interface:

  • Consultas de topologia : essas são consultas rápidas que se baseiam na topologia da sala digitalizada.Topology queries : These are fast queries that are based on the topology of the scanned room.
  • Consultas de forma : elas utilizam os resultados de suas consultas de topologia para localizar superfícies horizontais que são uma boa correspondência para formas personalizadas que você define.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.
  • Consultas de posicionamento de objeto : são consultas mais complexas que encontram o local de melhor ajuste com base em um conjunto de regras e restrições para o objeto.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.

Além das três consultas principais, há uma interface raycasting que pode ser usada para recuperar tipos de superfície marcada e uma malha de sala Watertight personalizada pode ser copiada.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.

Consultas de topologiaTopology queries

Dentro da DLL, o Gerenciador de topologia lida com a rotulagem do ambiente.Within the DLL, the topology manager handles labeling of the environment. Conforme mencionado acima, grande parte dos dados é armazenada em surfels, que estão contidos em um volume VOXEL.As mentioned above, much of the data is stored within surfels, which are contained within a voxel volume. Além disso, a estrutura PlaySpaceInfos é usada para armazenar informações sobre o Playspace, incluindo o alinhamento Mundial (mais detalhes sobre isso abaixo), piso e altura do teto.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.

A heurística é usada para determinar piso, teto e paredes.Heuristics are used for determining floor, ceiling, and walls. Por exemplo, a maior e menor superfície horizontal com uma área de superfície maior que 1 m2 é considerada a base.For example, the largest and lowest horizontal surface with greater than 1 m2 surface area is considered the floor. Observe que o caminho da câmera durante o processo de verificação também é usado nesse processo.Note that the camera path during the scanning process is also used in this process.

Um subconjunto das consultas expostas pelo Gerenciador de topologia é exposto por meio da DLL.A subset of the queries exposed by the Topology manager are exposed out through the DLL. As consultas de topologia expostas são as seguintes: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

Cada uma das consultas tem um conjunto de parâmetros, específico ao tipo de consulta.Each of the queries has a set of parameters, specific to the query type. No exemplo a seguir, o usuário especifica a altura mínima & largura do volume desejado, a altura mínima de posicionamento acima do andar e a quantidade mínima de espaço livre na frente do volume.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. Todas as medidas estão em metros.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)

Cada uma dessas consultas usa uma matriz pré-configurada de estruturas TopologyResult .Each of these queries takes a pre-allocated array of TopologyResult structures. O parâmetro locationCount especifica o comprimento da matriz passada.The locationCount parameter specifies the length of the passed-in array. O valor de retorno informa o número de locais retornados.The return value reports the number of returned locations. Esse número nunca é maior que o parâmetro locationCount passado.This number is never greater than the passed-in locationCount parameter.

O TopologyResult contém a posição central do volume retornado, a direção oposta (ou seja, normal) e as dimensões do espaço encontrado.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;
     };

Observe que, no exemplo de Unity, cada uma dessas consultas é vinculada a um botão no painel de interface do usuário virtual.Note that in the Unity sample, each of these queries is linked up to a button in the virtual UI panel. Os códigos de exemplo codificam os parâmetros de cada uma dessas consultas para valores razoáveis.The sample hard codes the parameters for each of these queries to reasonable values. Consulte SpaceVisualizer.cs no código de exemplo para obter mais exemplos.See SpaceVisualizer.cs in the sample code for more examples.

Consultas de formaShape queries

Dentro da DLL, o analisador de forma ( ShapeAnalyzer_W ) usa o analisador de topologia para corresponder às formas personalizadas definidas pelo usuário.Inside of the DLL, the shape analyzer ( ShapeAnalyzer_W ) uses the topology analyzer to match against custom shapes defined by the user. O exemplo de Unity tem um conjunto predefinido de formas que são mostradas no menu consulta, na guia forma.The Unity sample has a pre-defined set of shapes which are shown in the query menu, on the shape tab.

Observe que a análise de forma funciona apenas em superfícies horizontais.Note that the shape analysis works on horizontal surfaces only. Um sofá, por exemplo, é definido pela superfície de estação plana e a parte superior do sofá de volta.A couch, for example, is defined by the flat seat surface and the flat top of the couch back. A consulta de forma procura duas superfícies de um tamanho, altura e intervalo de aspecto específicos, com as duas superfícies alinhadas e conectadas.The shape query looks for two surfaces of a specific size, height, and aspect range, with the two surfaces aligned and connected. Usando a terminologia de APIs, a estação de sofá e a parte superior do sofá são componentes de forma e os requisitos de alinhamento são restrições de componente de forma.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.

Uma consulta de exemplo definida no exemplo de Unity ( ShapeDefinition.cs ) para objetos "sittable" é a seguinte: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);

Cada consulta de forma é definida por um conjunto de componentes de forma, cada um com um conjunto de restrições de componente e um conjunto de restrições de forma que lista as dependências entre os componentes.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. Este exemplo inclui três restrições em uma única definição de componente e nenhuma restrição de forma entre os componentes (já que há apenas um componente).This example includes three constraints in a single component definition and no shape constraints between components (as there is only one component).

Por outro lado, a forma de sofá tem dois componentes Shape e quatro restrições Shape.In contrast, the couch shape has two shape components and four shape constraints. Observe que os componentes são identificados por seu índice na lista de componentes do usuário (0 e 1 neste exemplo).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),
        };

As funções de wrapper são fornecidas no módulo do Unity para facilitar a criação de definições de formas personalizadas.Wrapper functions are provided in the Unity module for easy creation of custom shape definitions. A lista completa de restrições de componente e forma pode ser encontrada em SpatialUnderstandingDll.cs nas estruturas ShapeComponentConstraint e ShapeConstraint .The full list of component and shape constraints can be found in SpatialUnderstandingDll.cs within the ShapeComponentConstraint and the ShapeConstraint structures.

O retângulo azul realça os resultados da consulta de forma de cadeira.

O retângulo azul realça os resultados da consulta de forma de cadeira.The blue rectangle highlights the results of the chair shape query.

Resolvedor de posicionamento de objetoObject placement solver

As consultas de posicionamento de objeto podem ser usadas para identificar locais ideais no espaço físico para colocar seus objetos.Object placement queries can be used to identify ideal locations in the physical room to place your objects. O resolvedor encontrará o local de melhor ajuste, considerando as regras e restrições do objeto.The solver will find the best-fit location given the object rules and constraints. Além disso, as consultas de objeto persistem até que o objeto seja removido com chamadas Solver_RemoveObject ou Solver_RemoveAllObjects , permitindo o posicionamento restrito de vários objetos.In addition, object queries persist until the object is removed with Solver_RemoveObject or Solver_RemoveAllObjects calls, allowing constrained multi-object placement.

As consultas de posicionamento de objeto consistem em três partes: tipo de posicionamento com parâmetros, uma lista de regras e uma lista de restrições.Object placement queries consist of three parts: placement type with parameters, a list of rules, and a list of constraints. Para executar uma consulta, use a seguinte 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)

Essa função usa um nome de objeto, uma definição de posicionamento e uma lista de regras e restrições.This function takes an object name, placement definition, and a list of rules and constraints. Os wrappers do C# fornecem funções auxiliares de construção para facilitar a construção da regra e da restrição.The C# wrappers provide construction helper functions to make rule and constraint construction easy. A definição de posicionamento contém o tipo de consulta, ou seja, uma das seguintes opções: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,
                };

Cada um dos tipos de posicionamento tem um conjunto de parâmetros exclusivos para o tipo.Each of the placement types has a set of parameters unique to the type. A estrutura ObjectPlacementDefinition contém um conjunto de funções auxiliares estáticas para criar essas definições.The ObjectPlacementDefinition structure contains a set of static helper functions for creating these definitions. Por exemplo, para encontrar um local para colocar um objeto no chão, você pode usar a seguinte função: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)

Além do tipo de posicionamento, você pode fornecer um conjunto de regras e restrições.In addition to the placement type, you can provide a set of rules and constraints. As regras não podem ser violadas.Rules cannot be violated. Os locais de posicionamento possíveis que atendem ao tipo e às regras são então otimizados em relação ao conjunto de restrições para selecionar o local de posicionamento ideal.Possible placement locations that satisfy the type and rules are then optimized against the set of constraints to select the optimal placement location. Cada uma das regras e restrições pode ser criada pelas funções de criação estática fornecidas.Each of the rules and constraints can be created by the provided static creation functions. Uma regra de exemplo e uma função de construção de restrição são fornecidas abaixo.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)

A consulta de posicionamento de objeto abaixo está procurando um local para colocar um cubo de meio medidor na borda de uma superfície, longe de outros objetos anteriormente posicionados e perto do centro da sala.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());

Se for bem-sucedida, uma estrutura ObjectPlacementResult que contém a posição de posicionamento, dimensões e orientação será retornada.If successful, an ObjectPlacementResult structure containing the placement position, dimensions and orientation is returned. Além disso, o posicionamento é adicionado à lista interna de objetos posicionados da DLL.In addition, the placement is added to the DLL’s internal list of placed objects. As consultas de posicionamento subsequentes levarão esse objeto à conta.Subsequent placement queries will take this object into account. O arquivo LevelSolver.cs no exemplo de Unity contém mais consultas de exemplo.The LevelSolver.cs file in the Unity sample contains more example queries.

As caixas azuis mostram o resultado de três lugares em consultas de piso com as regras "distantes da posição da câmera".

As caixas azuis mostram o resultado de três lugares em consultas de piso com as regras "distantes da posição da câmera".The blue boxes show the result from three Place On Floor queries with "away from camera position" rules.

Dicas:Tips:

  • Ao resolver o local de posicionamento de vários objetos necessários para um cenário de nível ou aplicativo, primeiro resolva os objetos indispensável e grandes para maximizar a probabilidade de que um espaço possa ser encontrado.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.
  • A ordem de posicionamento é importante.Placement order is important. Se os posicionamentos de objeto não puderem ser encontrados, tente configurações menos restritas.If object placements cannot be found, try less constrained configurations. Ter um conjunto de configurações de fallback é essencial para dar suporte à funcionalidade em várias configurações de sala.Having a set of fallback configurations is critical to supporting functionality across many room configurations.

Conversão de RayRay casting

Além das três consultas principais, uma interface de conversão de Ray pode ser usada para recuperar tipos de superfície marcada e uma malha Watertight Playspace personalizada pode ser copiada após o espaço ter sido examinado e finalizado, os rótulos são gerados internamente para superfícies como piso, teto e paredes.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. A função PlayspaceRaycast usa um Ray e retorna se o raio colide com uma superfície conhecida e, nesse caso, informações sobre essa superfície na forma de um RaycastResult .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;
     };

Internamente, o Raycast é calculado em relação à representação computada 8cm cúbico VOXEL do Playspace.Internally, the raycast is computed against the computed 8cm cubed voxel representation of the playspace. Cada voxel contém um conjunto de elementos Surface com dados de topologia processados (também conhecidos como surfels).Each voxel contains a set of surface elements with processed topology data (also known as surfels). As surfels contidas na célula VOXEL interseccionada são comparadas e a melhor correspondência usada para pesquisar as informações de topologia.The surfels contained within the intersected voxel cell are compared and the best match used to look up the topology information. Esses dados de topologia contêm o rótulo retornado na forma da enumeração SurfaceTypes , bem como a área de superfície da superfície interseccionada.This topology data contains the labeling returned in the form of the SurfaceTypes enum, as well as the surface area of the intersected surface.

No exemplo de Unity, o cursor converte um raio cada quadro.In the Unity sample, the cursor casts a ray each frame. Primeiro, em relação aos colisors da Unity; segundo, em relação à representação Mundial do módulo de compreensão; e, finalmente, nos elementos da interface do usuário.First, against Unity’s colliders; second, against the understanding module’s world representation; and finally, against the UI elements. Neste aplicativo, a interface do usuário obtém prioridade, então o resultado da compreensão e, finalmente, os colisors do Unity.In this application, UI gets priority, then the understanding result, and finally, Unity’s colliders. O surfacetype é relatado como texto ao lado do cursor.The SurfaceType is reported as text next to the cursor.

Interseção de relatório de resultados Raycast com o piso.

Interseção de relatório de resultados Raycast com o piso.Raycast result reporting intersection with the floor.

Obter o códigoGet the code

O código-fonte aberto está disponível em MixedRealityToolkit.The open-source code is available in MixedRealityToolkit. Informe-nos nos fóruns de desenvolvedores do HoloLens se você usar o código em um projeto.Let us know on the HoloLens Developer Forums if you use the code in a project. Não podemos esperar para ver o que você faz com!We can't wait to see what you do with it!

Sobre o autorAbout the author

Jeff Evertt, Software Engineering Lead at Microsoft Jeff Evertt é um líder de engenharia de software que trabalhou no HoloLens desde o início dos dias, da incubação para a experiência de desenvolvimento.Jeff Evertt is a software engineering lead who has worked on HoloLens since the early days, from incubation to experience development. Antes do HoloLens, ele trabalhou no Xbox Kinect e no setor de jogos em uma ampla variedade de plataformas e jogos.Before HoloLens, he worked on the Xbox Kinect and in the games industry on a wide variety of platforms and games. Jeff é apaixonado por robótica, gráficos e coisas com luzes piscantes que vão soar.Jeff is passionate about robotics, graphics, and things with flashy lights that go beep. Ele gosta de aprender novas coisas e trabalhar com software, hardware e, particularmente, no espaço em que os dois interseccionam.He enjoys learning new things and working on software, hardware, and particularly in the space where the two intersect.

Veja tambémSee also