Étude de cas - développer les capacités de mappage spatial d’HoloLensCase study - Expanding the spatial mapping capabilities of HoloLens

Lors de la création de nos premières applications pour Microsoft HoloLens, nous avons impatients de voir simplement l’amplitude, nous risquons les limites du mappage spatial sur l’appareil.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, ingénieur logiciel chez Microsoft Studios, explique comment une nouvelle technologie a été développée en dehors de la nécessité de mieux contrôler comment les hologrammes sont placés dans un environnement d’utilisateur réel.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.

Regardez la vidéoWatch the video

Au-delà de mappage spatialBeyond spatial mapping

Bien que nous travaillions sur Fragments et Young pétarade, deux des premiers jeux pour HoloLens, nous avons constaté que lorsque nous faisions placement procédurale de hologrammes dans le monde physique, nous avions besoin d’un niveau plus élevé des connaissances sur l’environnement utilisateur.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. Chaque jeu avait ses propres besoins placement spécifique : Dans les Fragments, par exemple, nous souhaitons pouvoir faire la distinction entre les différentes surfaces, telles que la valeur plancher ou une table, pour placer des indices dans des endroits pertinents.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. Nous souhaitons également être en mesure d’identifier les surfaces qui caractères HOLOGRAPHIQUE taille réelle pourraient se trouvent, par exemple un canapé ou chaise.We also wanted to be able to identify surfaces that life-size holographic characters could sit on, such as a couch or a chair. Dans pétarade Young, nous voulions pétarade et ses adversaires pour être en mesure d’utiliser des surfaces déclenchés dans la salle d’un joueur en tant que plateformes.In Young Conker, we wanted Conker and his opponents to be able to use raised surfaces in a player's room as platforms.

Asobo Studios, notre partenaire de développement pour ces jeux, fait face à ce problème front et créé une technologie qui étend les fonctionnalités de mappage spatial de 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. À l’aide de cela, nous pouvons analyser l’espace d’un joueur et identifier les surfaces, murs, tables, chaises et étages.Using this, we could analyze a player's room and identify surfaces such as walls, tables, chairs, and floors. Nous avons reçu également la possibilité d’optimiser par rapport à un ensemble de contraintes pour déterminer le meilleur placement pour les objets HOLOGRAPHIQUE.It also gave us the ability to optimize against a set of constraints to determine the best placement for holographic objects.

Le code de présentation spatialThe spatial understanding code

Nous a pris le code d’origine du Asobo et créé une bibliothèque qui encapsule cette technologie.We took Asobo's original code and created a library that encapsulates this technology. Microsoft et Asobo ont maintenant ce code open source et qu’il est disponible sur MixedRealityToolkit que vous pouvez utiliser dans vos propres projets.Microsoft and Asobo have now open-sourced this code and made it available on MixedRealityToolkit for you to use in your own projects. Tout le code source est inclus, ce qui vous permet de le personnaliser selon vos besoins et partager vos améliorations avec la Communauté.All the source code is included, allowing you to customize it to your needs and share your improvements with the community. Le code pour le C++ Solveur a été encapsulé dans une DLL UWP et exposé à Unity avec un préfabriqué de dernière minute contenue dans 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.

Il existe de nombreuses requêtes utiles inclus dans l’exemple Unity qui vous permet de rechercher des espaces vides sur les murs, placer des objets sur le plafond ou sur les espaces de grande taille sur le sol, identifier les endroits pour les caractères dans cet état et une myriade d’autres requêtes spatiales compréhension.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.

Alors que la solution de mappage spatial fournie par HoloLens est conçue pour être suffisamment générique pour répondre aux besoins de toute la gamme des espaces de problème, le module de présentation spatial a été créé pour prendre en charge les besoins de deux jeux spécifiques.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. Par conséquent, sa solution est structurée autour d’un processus spécifique et des hypothèses :As such, its solution is structured around a specific process and set of assumptions:

  • Correction de taille playspace: L’utilisateur spécifie la taille maximale playspace dans l’appel d’init.Fixed size playspace: The user specifies the maximum playspace size in the init call.
  • Le processus d’analyse à usage unique: Le processus nécessite un discrètes phase où l’utilisateur parcourt autour d’analyse, en définissant le playspace.One-time scan process: The process requires a discrete scanning phase where the user walks around, defining the playspace. Fonctions de requête ne fonctionnera pas tant qu’une fois l’analyse a été finalisé.Query functions will not function until after the scan has been finalized.
  • Utilisateur driven playspace « peinture »: Pendant la phase d’analyse, l’utilisateur déplace et recherche autour de la playspace, peinture efficacement les zones qui doivent être incluses.User driven playspace “painting”: During the scanning phase, the user moves and looks around the playspace, effectively painting the areas which should be included. Le maillage généré est important de fournir des commentaires des utilisateurs durant cette phase.The generated mesh is important to provide user feedback during this phase.
  • À l’intérieur le programme d’installation de votre domicile ou office: Les fonctions de requête sont conçues autour des surfaces plats et des murs à angle droit.Indoors home or office setup: The query functions are designed around flat surfaces and walls at right angles. Il s’agit d’une limitation logicielle.This is a soft limitation. Toutefois, pendant la phase d’analyse, une analyse de l’axe principal est prévue pour optimiser le pavage de maille le long de l’axe principal et secondaire.However, during the scanning phase, a primary axis analysis is completed to optimize the mesh tessellation along major and minor axis.

Processus d’analyse salleRoom Scanning Process

Lorsque vous chargez le module de présentation spatiales, la première chose que vous effectuerez est analyse votre espace, par conséquent, toutes les surfaces utilisables, telles que le plancher, plafond et murs, sont identifiés et étiquetés.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. Pendant le processus d’analyse, vous cherchez votre salle et « paint » les domaines qui doivent être inclus dans l’analyse.During the scanning process, you look around your room and "paint' the areas that should be included in the scan.

Le maillage observé pendant cette phase est une composante importante de retour visuel qui permet aux utilisateurs de savoir quelles parties de la salle de conversation sont en cours d’analyse.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. La DLL pour le module de présentation spatial stocke en interne la playspace sous forme de grille des cubes de voxel 8cm en taille réelle.The DLL for the spatial understanding module internally stores the playspace as a grid of 8cm sized voxel cubes. Au cours de la partie initiale d’analyse, une analyse du composant principal est terminée pour déterminer les axes de la salle.During the initial part of scanning, a primary component analysis is completed to determine the axes of the room. En interne, elle stocke son espace voxel alignée sur ces axes.Internally, it stores its voxel space aligned to these axes. Une maille est générée environ toutes les secondes en extrayant l’isosurface le volume voxel.A mesh is generated approximately every second by extracting the isosurface from the voxel volume.

Spatiales mappage maille en blanc et présentation playspace maillage en vert

Spatiales mappage maille en blanc et présentation playspace maillage en vertSpatial mapping mesh in white and understanding playspace mesh in green

Le fichier SpatialUnderstanding.cs inclus gère le processus phase d’analyse.The included SpatialUnderstanding.cs file manages the scanning phase process. Il appelle les fonctions suivantes :It calls the following functions:

  • SpatialUnderstanding_Init: Appelée une fois au début.SpatialUnderstanding_Init: Called once at the start.
  • GeneratePlayspace_InitScan: Indique que la phase d’analyse doit commencer.GeneratePlayspace_InitScan: Indicates that the scan phase should begin.
  • GeneratePlayspace_UpdateScan_DynamicScan: Appelé pour chaque trame pour mettre à jour le processus d’analyse.GeneratePlayspace_UpdateScan_DynamicScan: Called each frame to update the scanning process. La position de la caméra et l’orientation est transmise et est utilisé pour le processus de peinture playspace décrit ci-dessus.The camera position and orientation is passed in and is used for the playspace painting process, described above.
  • GeneratePlayspace_RequestFinish: Appelé pour finaliser le playspace.GeneratePlayspace_RequestFinish: Called to finalize the playspace. Utiliser les zones « peints » pendant la phase d’analyse pour définir et verrouiller le playspace.This will use the areas “painted” during the scan phase to define and lock the playspace. L’application peut interroger les statistiques pendant la phase d’analyse, ainsi qu’une requête la maille personnalisée pour fournir des commentaires des utilisateurs.The application can query statistics during the scanning phase as well as query the custom mesh for providing user feedback.
  • Import_UnderstandingMesh: Lors de l’analyse, le SpatialUnderstandingCustomMesh comportement fourni par le module et placé sur le préfabriqué compréhension interroge régulièrement le maillage personnalisé généré par le processus.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. En outre, cela une fois de plus après que l’analyse a été finalisée.In addition, this is done once more after scanning has been finalized.

Le flux analyse, piloté par le SpatialUnderstanding comportement appels InitScan, puis UpdateScan chaque frame.The scanning flow, driven by the SpatialUnderstanding behavior calls InitScan, then UpdateScan each frame. Lorsque la requête de statistiques signale la couverture du raisonnable, l’utilisateur peut airtap pour appeler RequestFinish pour indiquer la fin de la phase d’analyse.When the statistics query reports reasonable coverage, the user can airtap to call RequestFinish to indicate the end of the scanning phase. UpdateScan continue à être appelée jusqu'à ce qu’il s’agit de retour la valeur indique que la DLL a terminé le traitement.UpdateScan continues to be called until it’s return value indicates that the DLL has completed processing.

Les requêtesThe queries

Une fois que l’analyse est terminée, vous serez en mesure d’accéder aux trois différents types de requêtes dans l’interface :Once the scan is complete, you'll be able to access three different types of queries in the interface:

  • Requêtes de topologie: Il s’agit des requêtes rapides qui reposent sur la topologie de la salle de conversation analysé.Topology queries: These are fast queries that are based on the topology of the scanned room.
  • Mettre en forme des requêtes: Ils utilisent les résultats de vos requêtes de topologie pour rechercher des surfaces horizontales qui sont une bonne correspondance avec des formes personnalisées que vous définissez.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.
  • Requêtes de sélection élective de l’objet: Il s’agit des requêtes plus complexes qui trouver l’emplacement ajusté selon un ensemble de règles et des contraintes pour l’objet.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.

Outre les trois requêtes principales, il existe une interface raycasting qui peut être utilisée pour récupérer les types de surface avec balises et une maille de salle étanches personnalisé peut être copiée.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.

Requêtes de topologieTopology queries

Dans la DLL, le Gestionnaire de topologie gère l’étiquetage de l’environnement.Within the DLL, the topology manager handles labeling of the environment. Comme mentionné ci-dessus, les données sont stockées dans surfels, qui sont contenus dans un volume voxel.As mentioned above, much of the data is stored within surfels, which are contained within a voxel volume. En outre, le PlaySpaceInfos structure est utilisée pour stocker des informations sur le playspace, y compris l’alignement du monde (plus de détails ci-dessous), floor et au plafond.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.

Heuristique utilisée pour déterminer les murs floor et ceiling.Heuristics are used for determining floor, ceiling, and walls. Par exemple, la surface plus grande et plus basses horizontale avec plus de 1 la surface d’exposition m2 est considéré comme le plancher.For example, the largest and lowest horizontal surface with greater than 1 m2 surface area is considered the floor. Notez que le chemin d’accès de l’appareil photo pendant le processus d’analyse est également utilisé dans ce processus.Note that the camera path during the scanning process is also used in this process.

Un sous-ensemble de requêtes exposées par le Gestionnaire de la topologie sont exposés via la DLL.A subset of the queries exposed by the Topology manager are exposed out through the DLL. Les requêtes de topologie exposés sont les suivantes :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

Chacune des requêtes a un ensemble de paramètres, spécifiques au type de requête.Each of the queries has a set of parameters, specific to the query type. Dans l’exemple suivant, l’utilisateur spécifie la hauteur minimale et la largeur du volume de votre choix, à la hauteur minimale de sélection élective au-dessus de la valeur plancher, la quantité minimale de dégagement devant le 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. Toutes les mesures sont en mètres.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)

Chacune de ces requêtes prend un tableau alloué au préalable de TopologyResult structures.Each of these queries takes a pre-allocated array of TopologyResult structures. Le locationCount paramètre spécifie la longueur du tableau passé.The locationCount parameter specifies the length of the passed-in array. La valeur de retour indique le nombre d’emplacements retournés.The return value reports the number of returned locations. Ce nombre n’est jamais supérieur à la passé dans locationCount paramètre.This number is never greater than the passed-in locationCount parameter.

Le TopologyResult contient la position centrale du volume retourné, la direction accessibles (par exemple, normale) et les dimensions de l’espace est trouvé.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;
     };

Notez que dans l’exemple Unity, chacune de ces requêtes est lié à un bouton dans le panneau de l’interface utilisateur virtuel.Note that in the Unity sample, each of these queries is linked up to a button in the virtual UI panel. L’exemple dur codes les paramètres pour chacune de ces requêtes à des valeurs raisonnables.The sample hard codes the parameters for each of these queries to reasonable values. Consultez SpaceVisualizer.cs dans l’exemple de code pour plus d’exemples.See SpaceVisualizer.cs in the sample code for more examples.

Requêtes de formeShape queries

À l’intérieur de la DLL, l’Analyseur de forme (ShapeAnalyzer_W) utilise l’Analyseur de topologie à mettre en correspondance des formes personnalisées définies par l’utilisateur.Inside of the DLL, the shape analyzer (ShapeAnalyzer_W) uses the topology analyzer to match against custom shapes defined by the user. L’exemple Unity a un ensemble prédéfini de formes qui figurent dans le menu de la requête, sous l’onglet de la forme.The Unity sample has a pre-defined set of shapes which are shown in the query menu, on the shape tab.

Notez que l’analyse de la forme fonctionne sur les surfaces horizontales uniquement.Note that the shape analysis works on horizontal surfaces only. Un canapé, par exemple, est défini par l’assise plat et haut plat de retour le canapé.A couch, for example, is defined by the flat seat surface and the flat top of the couch back. La requête shape recherche deux surfaces d’une plage de taille, la hauteur et aspect spécifique, avec les deux surfaces alignée et connecté.The shape query looks for two surfaces of a specific size, height, and aspect range, with the two surfaces aligned and connected. À l’aide de la terminologie de l’API, le siège canapé et le haut de l’arrière le canapé sont shape composants et l’alignement sur les exigences sont contraintes de composant de forme.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.

Un exemple de requête définie dans l’exemple Unity (ShapeDefinition.cs), pour les objets « sittable » se présente comme suit :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);

Chaque requête shape est défini par un ensemble de composants de la forme, chacun avec un ensemble de contraintes de composant et un ensemble de contraintes de forme qui répertorie les dépendances entre les composants.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. Cet exemple inclut trois contraintes dans une définition de composant unique et aucune contrainte de forme entre les composants (comme il n’existe qu’un seul composant).This example includes three constraints in a single component definition and no shape constraints between components (as there is only one component).

En revanche, la forme de canapé a deux composants de forme et quatre contraintes de forme.In contrast, the couch shape has two shape components and four shape constraints. Notez que les composants sont identifiés par leur index dans la liste des composants de l’utilisateur (0 et 1 dans cet exemple).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),
        };

Fonctions de wrapper sont fournies dans le module Unity pour simplifier la création de définitions de formes personnalisée.Wrapper functions are provided in the Unity module for easy creation of custom shape definitions. Vous trouverez la liste complète des contraintes de composant et de forme dans SpatialUnderstandingDll.cs au sein de la ShapeComponentConstraint et ShapeConstraint structures.The full list of component and shape constraints can be found in SpatialUnderstandingDll.cs within the ShapeComponentConstraint and the ShapeConstraint structures.

Rectangle bleu met en évidence les résultats de la requête shape chaise.

Rectangle bleu met en évidence les résultats de la requête shape chaise.The blue rectangle highlights the results of the chair shape query.

Solveur de sélection élective d’objetObject placement solver

Requêtes de sélection élective d’objet peuvent être utilisés pour identifier les emplacements idéale dans la salle physique pour placer vos objets.Object placement queries can be used to identify ideal locations in the physical room to place your objects. Le Solveur recherche l’emplacement ajusté, étant donné les règles de l’objet et les contraintes.The solver will find the best-fit location given the object rules and constraints. En outre, les requêtes d’objet persistent jusqu'à ce que l’objet est supprimé avec Solver_RemoveObject ou Solver_RemoveAllObjects appels, ce qui contraint placement d’objets multiples.In addition, object queries persist until the object is removed with Solver_RemoveObject or Solver_RemoveAllObjects calls, allowing constrained multi-object placement.

Requêtes de sélection élective d’objet se composent de trois parties : le type d’emplacement avec les paramètres, une liste de règles et une liste de contraintes.Object placement queries consist of three parts: placement type with parameters, a list of rules, and a list of constraints. Pour exécuter une requête, utilisez l’API suivante :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)

Cette fonction accepte un nom d’objet, définition de placement et une liste des règles et des contraintes.This function takes an object name, placement definition, and a list of rules and constraints. Le C# wrappers fournissent des fonctions d’assistance pour faciliter la construction de règle et de contrainte de construction.The C# wrappers provide construction helper functions to make rule and constraint construction easy. La définition de placement contient le type de requête, autrement dit, une des opérations suivantes :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,
                };

Chacun des types de sélection élective a un ensemble de paramètres uniques pour le type.Each of the placement types has a set of parameters unique to the type. Le ObjectPlacementDefinition structure contient un ensemble de fonctions d’assistance statiques pour la création de ces définitions.The ObjectPlacementDefinition structure contains a set of static helper functions for creating these definitions. Par exemple, pour rechercher un emplacement pour placer un objet sur le sol, vous pouvez utiliser la fonction suivante :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)

Outre le type de sélection élective, vous pouvez fournir un ensemble de règles et des contraintes.In addition to the placement type, you can provide a set of rules and constraints. Des règles ne peut pas être violées.Rules cannot be violated. Emplacements de positionnement possibles qui satisfont les type et les règles sont ensuite optimisés par rapport au jeu de contraintes pour sélectionner l’emplacement de placement optimal.Possible placement locations that satisfy the type and rules are then optimized against the set of constraints to select the optimal placement location. Chacune des règles et des contraintes peut être créé par les fonctions de création statique fourni.Each of the rules and constraints can be created by the provided static creation functions. Vous trouverez ci-dessous un exemple de fonction construction règle et de contrainte.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)

La requête de sélection élective d’objet ci-dessous recherche un emplacement pour placer un cube de moitié compteur sur le bord d’une surface, autre précédemment placer des objets et près du centre de la salle.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());

En cas de réussite, une ObjectPlacementResult structure contenant la position de placement, de dimensions et de l’orientation est retournée.If successful, an ObjectPlacementResult structure containing the placement position, dimensions and orientation is returned. En outre, le positionnement est ajouté à la liste interne de la DLL d’objets placés.In addition, the placement is added to the DLL’s internal list of placed objects. Requêtes de sélection élective ultérieures prennent cet objet en compte.Subsequent placement queries will take this object into account. Le LevelSolver.cs fichier dans l’exemple Unity contient plusieurs exemples de requêtes.The LevelSolver.cs file in the Unity sample contains more example queries.

Les cases bleues indiquent les résultats à partir de trois requêtes Place sur Floor avec des règles « suite à partir de la position d’une caméra ».

Les cases bleues indiquent les résultats à partir de trois requêtes Place sur Floor avec des règles « suite à partir de la position d’une caméra ».The blue boxes show the result from three Place On Floor queries with "away from camera position" rules.

Astuces :Tips:

  • Lors de la résolution pour l’emplacement du positionnement de plusieurs objets requis pour un scénario de niveau ou de l’application, tout d’abord résoudre les objets indispensables et de grande taille pour optimiser la probabilité qu’un espace peut être trouvé.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.
  • Ordre de sélection élective est important.Placement order is important. Si le placement de l’objet est introuvable, essayez de configurations moins limitées.If object placements cannot be found, try less constrained configurations. Il est essentiel de prenant en charge des fonctionnalités sur de nombreuses configurations de salle de disposer d’un ensemble de configurations de secours.Having a set of fallback configurations is critical to supporting functionality across many room configurations.

Ray castRay casting

Outre les trois requêtes principales, une interface de conversion de ray peut être utilisée pour récupérer des types de surface avec balises et d’une maille playspace étanches personnalisés peut être copiée out après la salle a été analysée et finalisée, étiquettes sont générés de manière interne pour les surfaces tels que le Floor, ceiling et murs.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. Le PlayspaceRaycast fonction prend un rayon et retourne si le rayon est en conflit avec une surface connue et si tel est le cas, plus d’informations sur cette surface sous la forme d’un 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;
     };

En interne, le raycast est calculée par rapport à la représentation sous forme de voxel calculée 8cm au cube de la playspace.Internally, the raycast is computed against the computed 8cm cubed voxel representation of the playspace. Chaque voxel contient un ensemble d’éléments de surface d’exposition des données de topologie traité (également appelé surfels).Each voxel contains a set of surface elements with processed topology data (also known as surfels). Les surfels contenues dans la cellule voxel intersectées sont comparées et la meilleure correspondance est utilisée pour rechercher les informations de topologie.The surfels contained within the intersected voxel cell are compared and the best match used to look up the topology information. Les données de cette topologie contient l’étiquetage retournée sous la forme de la SurfaceTypes enum, ainsi que de la surface d’exposition de la surface d’intersection.This topology data contains the labeling returned in the form of the SurfaceTypes enum, as well as the surface area of the intersected surface.

Dans l’exemple Unity, le curseur convertit un rayon chaque frame.In the Unity sample, the cursor casts a ray each frame. Tout d’abord, contre colliders de d’Unity ; en second lieu, par rapport à la représentation du monde du module de présentation ; et enfin, sur les éléments d’interface utilisateur.First, against Unity’s colliders; second, against the understanding module’s world representation; and finally, against the UI elements. Dans cette application, l’interface utilisateur obtient la priorité, puis le résultat de la présentation et enfin, colliders de d’Unity.In this application, UI gets priority, then the understanding result, and finally, Unity’s colliders. Le SurfaceType est signalé sous forme de texte en regard du curseur.The SurfaceType is reported as text next to the cursor.

Résultat Raycast intersection avec la valeur plancher de création de rapports.

Résultat Raycast intersection avec la valeur plancher de création de rapports.Raycast result reporting intersection with the floor.

Obtenir le codeGet the code

Le code open source est disponible dans MixedRealityToolkit.The open-source code is available in MixedRealityToolkit. Faites-le nous savoir sur le Forums des développeurs HoloLens si vous utilisez le code dans un projet.Let us know on the HoloLens Developer Forums if you use the code in a project. Nous sommes impatients de voir ce que vous en faire !We can't wait to see what you do with it!

À propos de l’auteurAbout the author

Jeff Evertt, Software Engineering Lead at Microsoft Jeff Evertt est un prospect d’ingénierie logicielle qui a travaillé sur HoloLens depuis le début, à partir d’incubation en informatique pour expérimenter le développement.Jeff Evertt is a software engineering lead who has worked on HoloLens since the early days, from incubation to experience development. Avant de HoloLens, il a travaillé sur le Xbox Kinect et dans l’industrie de jeux sur un large éventail de plateformes et des jeux.Before HoloLens, he worked on the Xbox Kinect and in the games industry on a wide variety of platforms and games. Jeff est passionné de la robotique, des graphiques et des choses avec les voyants lumineux qui vont du signal sonore.Jeff is passionate about robotics, graphics, and things with flashy lights that go beep. Il aime apprendre de nouvelles choses et fonctionne sur le logiciel, matériel et en particulier dans l’espace où les deux se croisent.He enjoys learning new things and working on software, hardware, and particularly in the space where the two intersect.

Voir aussiSee also