導入事例 - HoloLens の空間のマッピング機能を展開します。Case 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. Jeff Evertt、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.

ビデオを見るWatch the video

空間マッピングを超えるBeyond spatial mapping

作業中にフラグメントYoung Conker2 つ、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. など、ソファまたは椅子等身大 holographic 文字に座って、サーフェスを識別するためにできるようにすることも考えました。We also wanted to be able to identify surfaces that life-size holographic characters could sit on, such as a couch or a chair. Young の Conker で Conker と彼の対戦相手のプレイヤーの部屋で発生サーフェスをプラットフォームとして使用することができると考えました。In Young Conker, we wanted Conker and his opponents to be able to use raised surfaces in a player's room as platforms.

Asobo スタジオ、これらのゲームの開発パートナーが正面を向けたこの問題に直面し、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

Asobo の元のコードをこのテクノロジをカプセル化するライブラリを作成します。We took Asobo's original code and created a library that encapsulates this technology. Microsoft と Asobo これでこのコードをオープン ソース化されで利用できるようにMixedRealityToolkit独自のプロジェクトで使用するためです。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++ソルバーを UWP DLL にラップし、Unity に公開されている、 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.

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 によって提供される空間マッピング ソリューションを設計して、あらゆる問題領域のニーズを満たすのに十分なジェネリックにする、中に、空間理解モジュールは 2 つの特定のゲームのニーズをサポートするために構築されました。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:

  • 固定サイズ playspace:ユーザーは、init 呼び出しで最大 playspace サイズを指定します。Fixed size playspace: The user specifies the maximum playspace size in the init call.
  • 1 回限りのスキャン プロセス:プロセスが必要、個別スキャン フェーズの周囲、ユーザーがについて説明します、playspace を定義します。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.
  • ユーザー駆動 playspace「描画」:スキャン フェーズでは、ユーザーが移動し、効果的に含まれるとして使用する領域を描画、playspace を検索します。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.
  • 屋内自宅またはオフィスのセットアップ:クエリ関数は、フラット サーフェスと直角に交わって壁を中心に設計されています。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

自分のスペースで使用可能なすべてのサーフェスをスキャンは、空間的に理解モジュールを読み込むときに、まず操作を行います: floor、ceiling、壁など — が特定され、ラベル付けします。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 は、サイズ 8 cm voxel キューブのグリッドとして、playspace を内部的に格納します。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. 内部的には、これらの軸に配置されたその voxel 領域を格納します。Internally, it stores its voxel space aligned to these axes. メッシュには、voxel ボリュームからアイソサーフェスを抽出することによって毎秒約が生成されます。A mesh is generated approximately every second by extracting the isosurface from the voxel volume.

白色のメッシュのマップを playspace を把握する空間が緑色でメッシュします。

白色のメッシュのマップを playspace を把握する空間が緑色でメッシュします。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:開始時に 1 回呼び出されます。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. カメラの位置と向きに渡され、playspace 描画プロセスは、上記で説明したために使用します。The camera position and orientation is passed in and is used for the playspace painting process, described above.
  • GeneratePlayspace_RequestFinish:Playspace を最終処理と呼ばれます。GeneratePlayspace_RequestFinish: Called to finalize the playspace. これを定義し、ロック、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:スキャン中に、 SpatialUnderstandingCustomMeshモジュールによって提供されており、理解プレハブ上に配置の動作は、プロセスによって生成されるカスタムのメッシュを定期的にクエリします。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.

スキャンのフローによって、 SpatialUnderstanding動作呼び出しInitScan、しUpdateScan各フレーム。The scanning flow, driven by the SpatialUnderstanding behavior calls InitScan, then UpdateScan each frame. 統計情報のクエリが妥当なカバレッジを報告したときで、ユーザーを呼び出す airtap RequestFinishスキャン フェーズの終了を示す。When the statistics query reports reasonable coverage, the user can airtap to call RequestFinish to indicate the end of the scanning phase. UpdateScanが戻り値になるまでに呼び出される継続値では、DLL の処理が完了したことを示します。UpdateScan continues to be called until it’s return value indicates that the DLL has completed processing.

クエリThe queries

スキャンが完了すると、インターフェイス内のクエリの 3 つの異なる型にアクセスすることができます。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 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.

3 つの主要なクエリだけでなく、タグが付けられたサーフェイスのタイプを取得するために使用できるレイキャスト インターフェイスがあるし、カスタムのような厳重な部屋のメッシュをコピーすることができます。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. 前述のとおり、surfels voxel ボリューム内に格納されているデータの多く格納されます。As mentioned above, much of the data is stored within surfels, which are contained within a voxel volume. さらに、 PlaySpaceInfos構造を使用して、世界中の配置 (詳細については後述)、floor、ceiling 高さなど、playspace に関する情報を格納します。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.

ヒューリスティックは、floor、ceiling、壁を決定するために使用されます。Heuristics are used for determining floor, ceiling, and walls. たとえば、1 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)

これらの各クエリの事前に割り当てられた配列を取得するTopologyResult構造体。Each of these queries takes a pre-allocated array of TopologyResult structures. LocationCountパラメーターが渡された配列の長さを指定します。The locationCount parameter specifies the length of the passed-in array. 戻り値は、返される位置の数を報告します。The return value reports the number of returned locations. この数が、渡されたに超えることはありませんlocationCountパラメーター。This number is never greater than the passed-in locationCount parameter.

TopologyResult返されるボリュームに接続する方向 (つまり標準)、および検索の領域の大きさの中央の位置が含まれています。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 のサンプルでは、これらの各クエリがリンクされている仮想 UI パネルのボタンに注意してください。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 クエリ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. たとえば、ソファーは、戻るカウチのフラットの上端とフラット seat 画面によって定義されます。A couch, for example, is defined by the flat seat surface and the flat top of the couch back. Shape クエリは、特定のサイズ、高さ、および縦横範囲の配置し、接続されている 2 つのサーフェスの 2 つのサーフェスを探します。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) は、"sittable"オブジェクトの次のようには。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);

各図形のクエリは、それぞれに、一連のコンポーネントの制約と、コンポーネント間の依存関係の一覧を表示する一連の図形の制約、図形のコンポーネントのセットによって定義されます。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. この例には、(1 つだけのコンポーネントであるため)、1 つのコンポーネントの定義とコンポーネント間で制約のない図形で次の 3 つの制約が含まれます。This example includes three constraints in a single component definition and no shape constraints between components (as there is only one component).

これに対し、ソファ図形は、2 つのコンポーネントの図形と図形の 4 つの制約をが。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内、 ShapeComponentConstraintShapeConstraint構造体。The full list of component and shape constraints can be found in SpatialUnderstandingDll.cs within the ShapeComponentConstraint and the ShapeConstraint structures.

青い四角形には、椅子の shape クエリの結果が強調表示されます。

青い四角形には、椅子の shape クエリの結果が強調表示されます。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.

オブジェクト配置のクエリは、3 つの部分で構成されています: パラメーター、一連の規則、制約のリストと配置の種類。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. ObjectPlacementDefinition構造には、これらの定義を作成するための静的なヘルパー関数のセットが含まれています。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());

成功した場合、 ObjectPlacementResult配置位置、ディメンション、および印刷の向きを含む構造体が返されます。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.

青い四角形は、"離れたからカメラの位置"規則の 3 つの場所でフロア クエリから結果を表示します。

青い四角形は、"離れたからカメラの位置"規則の 3 つの場所でフロア クエリから結果を表示します。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

3 つの主要なクエリだけでなく、ray キャスト インターフェイスを使用してタグが付けられたサーフェイスのタイプを取得して、カスタムのような厳重な playspace メッシュをコピーすることができますを部屋がスキャンされ、ファイナライズ後ラベルが内部的に生成されるなどの表面に対して、floor、ceiling、および壁します。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. PlayspaceRaycast関数光線受け取り射線が既知の画面と競合する場合とそうである場合に返されますの形式でその画面については、 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;
     };

内部的には、playspace の計算の 8 cm cubed voxel 表現に対して、raycast が計算されます。Internally, the raycast is computed against the computed 8cm cubed voxel representation of the playspace. 各 voxel には、一連画面要素に処理されたトポロジのデータ (surfels とも呼ばれます) にはが含まれています。Each voxel contains a set of surface elements with processed topology data (also known as surfels). Voxel が交差するセル内に含まれる surfels が比較され、最も一致するトポロジ情報を検索するために使用します。The surfels contained within the intersected voxel cell are compared and the best match used to look up the topology information. このトポロジのデータが含まれています、ラベル付けの形式で返される、 SurfaceTypes列挙型、交差する画面の表面領域とします。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 のコライダー; に対して最初に、understanding モジュールの世界の表現; に対して第 2 に、UI 要素に対して最後と。First, against Unity’s colliders; second, against the understanding module’s world representation; and finally, against the UI elements. このアプリケーションでは、UI は、優先度、し、理解の結果、および最後に、Unity のコライダーを取得します。In this application, UI gets priority, then the understanding result, and finally, Unity’s colliders. SurfaceTypeカーソルの横にあるテキストとしてレポートされます。The SurfaceType is reported as text next to the cursor.

Raycast 結果の床面との交差を報告します。

Raycast 結果の床面との交差を報告します。Raycast result reporting intersection with the floor.

コードを入手するGet the code

オープン ソース コードはMixedRealityToolkitします。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 Jeff Evertt HoloLens の開発を体験する育成から、初期の段階から作業しているソフトウェア エンジニア リング リードです。Jeff Evertt is a software engineering lead who has worked on HoloLens since the early days, from incubation to experience development. HoloLens、前に、Xbox Kinect にし、多様なプラットフォームやゲームのゲーム業界で働いていました。Before HoloLens, he worked on the Xbox Kinect and in the games industry on a wide variety of platforms and games. Jeff はロボット工学、グラフィック、およびピカピカ ビープ音を移動することに熱心です。Jeff is passionate about robotics, graphics, and things with flashy lights that go beep. 彼の新機能を学習し、ソフトウェア、ハードウェア、および特に 2 つの交差領域の操作を楽しんでいます。He enjoys learning new things and working on software, hardware, and particularly in the space where the two intersect.

関連項目See also