Share via


シーンの理解 SDK の概要

シーンの理解は、Mixed Reality デバイスによってキャプチャされた非構造化環境センサー データを変換し、強力な抽象表現に変換します。 この SDK は、アプリケーションとシーンの理解ランタイムとの間の通信レイヤーとして機能します。 これは、3D 表現用の 3D シーン グラフや 2D アプリケーション用の 2D 四角形とパネルなど、既存の標準コンストラクトを模倣しようとするものです。 シーンの理解は、模倣の構築中に具象化フレームワークにマップされますが、一般に、シーンの理解はフレームワークに依存しないため、これと対話する多様なフレームワーク間で相互運用性を実現できます。 シーンの理解は、SDK の役割を進化させることで、新しい表現と機能が統合されたフレームワーク内で引き続き公開されることを保証します。 このドキュメントでは、まず、開発環境や使用状況について理解を深めるための概要を紹介し、特定のクラスと構成要素に関するより詳細なドキュメントを提供します。

SDK の入手場所

SceneUnderstanding SDK は、Mixed Reality 機能ツールを使用してダウンロードできます。

注意: 最新リリースはプレビュー パッケージに依存しており、プレリリース パッケージを表示するには、そのパッケージを有効にする必要があります。

バージョン 0.5.2022 以降では、シーンの理解によって C# および C++ の言語投影がサポートされるため、アプリケーションは Win32 または UWP プラットフォーム用のアプリケーションを開発できます。 このバージョンでは、SceneUnderstanding は、SceneObserver を除く unity のエディター内サポートをサポートします。SceneObserver は、HoloLens2 との通信にのみ使用されます。

SceneUnderstanding には Windows SDK バージョン 18362 以降が必要です。

概念

シーン

Mixed Reality デバイスは、環境内で認識されている内容に関する情報を絶えず統合しています。 シーンの理解は、これらすべてのデータ ソースを通り抜け、1 つのまとまりを持つ抽象化を生成します。 Scene Understanding はシーンを生成します。これは、単一のモノ (壁、天井、床など) のインスタンスを表す SceneObjects の構成です。シーン オブジェクト自体は、[SceneComponents] の構成であり、この SceneObject を構成するより細かい部分を表します。 コンポーネントの例としては、四角形やメッシュなどがありますが、将来的には、境界ボックス、衝突メッシュ、メタデータなどを表すことができます。

生のセンサー データをシーンに変換するプロセスは、負荷の高い処理である可能性があります。これは、中規模の空間 (50 x 50 m 以下) で数秒間、大規模の空間 (10 x 10 m 以下) で数分間です。そのため、アプリケーションの要求なしにデバイスが計算すべきものではありません。 代わりに、必要に応じて、アプリケーションによってシーン生成がトリガーされます。 SceneObserver クラスには、シーンを計算または逆シリアル化できる静的メソッドがあります。このメソッドを使用して、列挙および操作を行うことができます。 計算アクションは要求に応じて CPU で実行されますが、別のプロセス (Mixed Reality ドライバー) で実行されます。 ただし、別のプロセスで計算を行う場合、結果として得られるシーン データは、アプリケーションのシーン オブジェクトに格納され、保持されます。

このプロセス フローを示す図を以下に示します。また、シーンの理解ランタイムと接続する 2 つのアプリケーションの例を示します。

プロセス図

左側に Mixed Reality ランタイムの図があります。これは常にオンになっており、独自のプロセスで実行されています。 このランタイムは、デバイスの追跡や空間マッピング、およびシーンの理解がユーザーの周辺世界についての理解し推測するために使用するその他の操作の実行を担います。 図の右側には、シーンの理解を活用する 2 つの理論的なアプリケーションが示されています。 MRTK と接続する最初のアプリケーションは、シーンの理解 SDK を内部的に使用し、2 つ目のアプリケーションは、2 つの異なるシーン インスタンスを計算して使用します。 この図の 3 つのすべてのシーンでは、個別のインスタンスが生成されます。ドライバーは、アプリケーション間で共有されるグローバル状態を追跡しません。また、あるシーン内のシーン オブジェクトは、別のシーンでは見つかりません。 シーンの理解は、時間の経過と共に追跡するメカニズムを提供しますが、これは SDK を使用して行われます。 追跡コードは、アプリのプロセスの SDK で既に実行されています。

各シーンでは、アプリケーションのメモリ領域にデータが格納されるため、シーン オブジェクトまたはその内部データのすべての関数がアプリケーションのプロセスで常に実行されると見なせます。

Layout

シーンの理解を操作するには、ランタイムが論理的および物理的にコンポーネントを表す方法を知って理解することが重要です。 シーンは、主要な改訂を必要とせずに将来の要件を満たすように、柔軟な基になる構造を維持しながら、単純なレイアウトを持つデータを表します。 このシーンでは、すべてのコンポーネント (すべてのシーン オブジェクトの構成要素) をフラット リストに格納し、特定のコンポーネントが他のコンポーネントを参照する参照を使用して階層とコンポジションを定義します。

次に、そのフラットと論理形式の両方での構造の例を示します。

論理レイアウト物理レイアウト
    Scene
    • SceneObject_1
      • SceneMesh_1
      • SceneQuad_1
      • SceneQuad_2
    • SceneObject_2
      • SceneQuad_1
      • SceneQuad_3
    • SceneObject_3
      • SceneMesh_3
  • SceneObject_1
  • SceneObject_2
  • SceneObject_3
  • SceneQuad_1
  • SceneQuad_2
  • SceneQuad_3
  • SceneMesh_1
  • SceneMesh_2

この図は、シーンの物理的レイアウトと論理的レイアウトの違いを示しています。 左側には、シーンを列挙するときにアプリケーションに表示されるデータの階層型レイアウトが表示されます。 右側には、必要に応じて個別にアクセスできる 12 個の個別のコンポーネントで構成されているシーンがあることがわかります。 新しいシーンを処理する場合、アプリケーションはこの階層を論理的にウォークすることを想定しますが、シーンの更新間を追跡する場合、一部のアプリケーションは、2 つのシーン間で共有される特定のコンポーネントを対象にするだけで対処する場合があります。

API の概要

次のセクションでは、シーンの理解の構造の概要について説明します。 このセクションを読むと、シーンの表現方法や、さまざまなコンポーネントがどのように使用されるかについて理解できます。 次のセクションでは、具体的なコード例と、この概要でコメントされている追加の詳細について説明します。

以下で説明するすべての型は、Microsoft.MixedReality.SceneUnderstanding 名前空間に存在します。

SceneComponents

これまでに、バックグラウンドの論理的レイアウトを理解したところで、SceneComponents の概念と、それらを使用して階層を構築する方法について説明します。 SceneComponents は、メッシュ、四角形、境界ボックスなど、1 つのコアを表す SceneUnderstanding の最も細かい単位の分解物です。 SceneComponents は、独立して更新でき、他の SceneComponents が参照できるものです。したがって、この種の追跡または参照メカニズムを可能にする一意の ID である単一のグローバル プロパティがあります。 ID は、シーン階層の論理構成およびオブジェクトの永続化 (別のシーンと関係する特定のシーンを更新する働き) に使用されます。

新しく計算されたすべてのシーンを個別として処理し、その中のすべてのデータを列挙するだけで、ID は主に透過的になります。 ただし、複数の更新に対してコンポーネントを追跡する場合は、これらの ID を使用して、シーン オブジェクト間の SceneComponents のインデックス作成と検索を行います。

SceneObjects

SceneObject は、"物" のインスタンスを表す SceneComponent です。たとえば、壁、床、天井などが、それらの種類のプロパティで表されます。 SceneObjects は幾何学図形であるため、空間内の場所を表す関数とプロパティがありますが、ジオメトリックや論理構造は含まれていません。 代わりに、SceneObjects は他の SceneComponents、特に SceneQuads、SceneMeshes を参照しています。これは、システムでサポートされているさまざまな表現を提供します。 新しいシーンが計算されると、ほとんどの場合、アプリケーションは、目的の内容を処理するためにシーンの SceneObjects を列挙します。

SceneObjects は、次のいずれかを持つことができます。

SceneObjectKind 説明
バックグラウンドSceneObject は、他の認識された種類のシーン オブジェクトの 1 つではないことが知られています。 このクラスは、背景が壁、床、天井などではないことがわかっている不明なものと混同しないようにしてください。明なものはまだ分類されていません。
Wall物理的な壁面。 壁面は、移動しない環境構造であると見なされます。
床は、誰もが歩けるすべての面です。 注意: 階段は床ではありません。 また、床は歩けるすべての面であることを前提としています。したがって、1 つの床面を明確に想定することはできません。 複数レベルの構造体、斜面などのすべてが、床として分類される必要があります。
Ceiling部屋の上面。
プラットフォームホログラムを配置できる大きな平面。 これらは、テーブル、カウンタートップ、その他の大きな水平面を表す傾向があります。
Worldラベル付けに認知されない幾何学図形データ用の予約済みラベル。 EnableWorldMesh 更新フラグを設定して生成されたメッシュは、世界として分類されます。
Unknownこのシーン オブジェクトはまだ分類されておらず、種類が割り当てられていません。 これは背景と混同しないでください。このオブジェクトは何でもある可能性がありますが、システムはまだ十分に強力な分類を考え出していません。

SceneMesh

SceneMesh は、三角形リストを使用して任意の幾何学図形オブジェクトの幾何学図形を概算する SceneComponent です。 SceneMeshes は、いくつかの異なるコンテキストで使用されます。これらは、防水セル構造のコンポーネントを表したり、シーンに関連付けられている非送信の空間マッピング メッシュを表す WorldMesh として表したりできます。 各メッシュに用意されているインデックスと頂点のデータでは、すべての最新のレンダリング API で三角形メッシュをレンダリングするために使用される頂点バッファーとインデックス バッファーと同じ使い慣れたレイアウトが使用されます。 シーンの理解では、メッシュは 32 ビット インデックスを使用し、特定のレンダリング エンジンのチャンクに分割する必要がある場合があります。

回転順序と座標系

シーンの理解によって生成されるメッシュはすべて、時計回りの順序を使用して、右回りの座標系でメッシュを返す必要があります。

注意: .191105 より前の OS ビルドには、"World" メッシュが反時計回りの回転順で返される既知のバグがある可能性があります。このバグは、その後修正されています。

SceneQuad

SceneQuad は、3D の世界を占有する 2D サーフェスを表す SceneComponent です。 SceneQuads は ARKit ARPlaneAnchor または ARCore Planes と同様に使用できますが、フラット アプリで使用される 2D キャンバスや拡張 UX として、より高レベルの機能が提供されます。2D 固有の API は、配置とレイアウトが使いやすくなるように四角形用に用意されています。また、四角形を使用する開発は、3D メッシュでなく 2D のキャンバスを操作するように (レンダリングを除いて) 感じられます。

SceneQuad 図形

SceneQuads では、2D で四角形の境界サーフェスが定義されます。 ただし、SceneQuads は、任意の複雑な図形 (ドーナツ型テーブルなど) を持つサーフェスを表します。四角形のサーフェスの複雑な形状を表すには、GetSurfaceMask API を使用して、指定したイメージ バッファーにサーフェスの図形をレンダリングできます。 四角形を持つ SceneObject にもメッシュがある場合、メッシュの三角形はこのレンダリングされた画像と同等である必要があります。これらはどちらも、2D 座標または 3D 座標で、サーフェスの実際のジオメトリを表します。

シーンの理解 SDK の詳細とリファレンス

Note

MRTK を使用する場合は、MRTK の ['WindowsSceneUnderstandingObserver'](xref:Microsoft.MixedReality.Toolkit.WindowsSceneUnderstanding.Experimental.WindowsSceneUnderstandingObserver?view=mixed-reality-toolkit-unity-2020-dotnet-2.8.0&preserve-view=true) と対話するため、ほとんどの状況ではこのセクションをスキップする可能性があることに注意してください。 詳細については、MRTK シーンの理解ドキュメント (/windows/mixed-reality/mrtk-unity/features/spatial-awareness/scene-understanding) を参照してください。

次のセクションでは、SceneUnderstanding の基本について理解を深めることができます。 このセクションでは、基本的な情報を提供します。その時点で、SceneUnderstanding が包括的に使用される方法を確認するために、サンプル アプリケーションを参照するのに十分なコンテキストが得られるはずです。

初期化

SceneUnderstanding を使用する最初の手順は、アプリケーションがシーン オブジェクトへの参照を取得する手順です。 これは、2 つの方法のいずれかを使用して実行できます。シーンはドライバーによって計算するか、過去に計算された既存のシーンを逆シリアル化することで計算できます。 後者は、開発中に SceneUnderstanding を操作する場合に便利です。アプリケーションとエクスペリエンスは、Mixed Reality デバイスを使用せずに迅速にプロトタイプを作成できます。

シーンは SceneObserver を使用して計算されます。 シーンを作成する前に、アプリケーションはデバイスに対してクエリを実行して SceneUnderstanding をサポートし、SceneUnderstanding に必要な情報に対してユーザー アクセスを要求する必要があります。

if (!SceneObserver.IsSupported())
{
    // Handle the error
}

// This call should grant the access we need.
await SceneObserver.RequestAccessAsync();

RequestAccessAsync() が呼び出されない場合、新しいシーンの計算は失敗します。 次に、Mixed Reality ヘッドセットの周囲にルートが設定され、半径が 10 m の新しいシーンを計算します。

// Create Query settings for the scene update
SceneQuerySettings querySettings;

querySettings.EnableSceneObjectQuads = true;                                       // Requests that the scene updates quads.
querySettings.EnableSceneObjectMeshes = true;                                      // Requests that the scene updates watertight mesh data.
querySettings.EnableOnlyObservedSceneObjects = false;                              // Do not explicitly turn off quad inference.
querySettings.EnableWorldMesh = true;                                              // Requests a static version of the spatial mapping mesh.
querySettings.RequestedMeshLevelOfDetail = SceneMeshLevelOfDetail.Fine;            // Requests the finest LOD of the static spatial mapping mesh.

// Initialize a new Scene
Scene myScene = SceneObserver.ComputeAsync(querySettings, 10.0f).GetAwaiter().GetResult();

データからの初期化 (PC パスとも呼ばれる)

シーンは直接使用するために計算できますが、後で使用するためにシリアル化された形式で計算することもできます。 これは、開発者がデバイスを必要とせずにシーンの理解を操作してテストできるので、開発に役立ちます。 シーンをシリアル化する働きは、シーンの計算とほぼ同じです。データは SDK によってローカルで逆シリアル化されるのではなく、アプリケーションに返されます。 その後、自分で逆シリアル化するか、将来使用するために保存できます。

// Create Query settings for the scene update
SceneQuerySettings querySettings;

// Compute a scene but serialized as a byte array
SceneBuffer newSceneBuffer = SceneObserver.ComputeSerializedAsync(querySettings, 10.0f).GetAwaiter().GetResult();

// If we want to use it immediately we can de-serialize the scene ourselves
byte[] newSceneData = new byte[newSceneBuffer.Size];
newSceneBuffer.GetData(newSceneData);
Scene mySceneDeSerialized = Scene.Deserialize(newSceneData);

// Save newSceneData for later

SceneObject の列挙

これで、アプリケーションにシーンが追加されたので、アプリケーションは SceneObjects を参照して処理できるようになりました。 これを行うには、SceneObjects プロパティにアクセスします。

SceneObject firstFloor = null;

// Find the first floor object
foreach (var sceneObject in myScene.SceneObjects)
{
    if (sceneObject.Kind == SceneObjectKind.Floor)
    {
        firstFloor = sceneObject;
        break;
    }
}

コンポーネントの更新とコンポーネントの再検索

シーン内のコンポーネントを取得する FindComponent という別の関数があります。 この関数は、追跡オブジェクトを更新し、後のシーンで検索する場合に便利です。 次のコードでは、前のシーンを基準に新しいシーンを計算し、新しいシーン内の床を検索します。

// Compute a new scene, and tell the system that we want to compute relative to the previous scene
Scene myNextScene = SceneObserver.ComputeAsync(querySettings, 10.0f, myScene).GetAwaiter().GetResult();

// Use the Id for the floor we found last time, and find it again
firstFloor = (SceneObject)myNextScene.FindComponent(firstFloor.Id);

if (firstFloor != null)
{
    // We found it again, we can now update the transforms of all objects we attached to this floor transform
}

シーン オブジェクトからのメッシュと四角形へのアクセス

SceneObjects が見つかると、アプリケーションは、構成されている四角形またはメッシュに含まれるデータにアクセスする必要が最も高い可能性があります。 このデータには、Quads プロパティと Meshes プロパティを使用してアクセスします。 次のコードは、床オブジェクトのすべての四角形とメッシュを列挙します。


// Get the transform for the SceneObject
System.Numerics.Matrix4x4 objectToSceneOrigin = firstFloor.GetLocationAsMatrix();

// Enumerate quads
foreach (var quad in firstFloor.Quads)
{
    // Process quads
}

// Enumerate meshes
foreach (var mesh in firstFloor.Meshes)
{
    // Process meshes
}

シーンの原点に対して相対的な変換を持つ SceneObject であることに注意してください。 これは、SceneObject は物のインスタンスを表し、空間内で検索可能であり、四角形とメッシュは親に対して変換されるジオメトリを表すためです。 同じ SceneMesh/SceneQuad SceneComponents を参照する SceneObject を分離できます。また、SceneObject に複数の SceneMesh/SceneQuad をもたせることもできます。

変換を処理する

シーンの理解は、変換を処理するときに、従来の 3D シーン表現に合わせて意図的に試行しました。 したがって、各シーンは、最も一般的な 3D 環境表現と同様に、1 つの座標系に限定されます。 SceneObjects は、それぞれその座標系に対する相対的な位置を提供します。 アプリケーションが単一の発生元が提供する範囲の制限を拡大するシーンを扱っている場合は、SceneObjects を SpatialAnchors に固定したり、複数のシーンを生成してマージしたりできますが、わかりやすくするために、Scene.OriginSpatialGraphNodeId によって定義された 1 つの NodeId によってローカライズされた独自の発生元に防水シーンが存在すると想定します。

たとえば、次の Unity コードは、Windows Perception API と Unity API を使用して座標系を一緒に配置する方法を示しています。 Windows Perception API の詳細については SpatialCoordinateSystemSpatialGraphInteropPreview を参照し、Unity の世界の発生元に対応する SpatialCoordinateSystem を取得する方法の詳細については Unity での Mixed Reality ネイティブ オブジェクトに関するページを参照してください。

private System.Numerics.Matrix4x4? GetSceneToUnityTransformAsMatrix4x4(SceneUnderstanding.Scene scene)
{
    System.Numerics.Matrix4x4? sceneToUnityTransform = System.Numerics.Matrix4x4.Identity;

    
    Windows.Perception.Spatial.SpatialCoordinateSystem sceneCoordinateSystem = Microsoft.Windows.Perception.Spatial.Preview.SpatialGraphInteropPreview.CreateCoordinateSystemForNode(scene.OriginSpatialGraphNodeId);
    Windows.Perception.Spatial.SpatialCoordinateSystem unityCoordinateSystem = Microsoft.Windows.Perception.Spatial.SpatialCoordinateSystem.FromNativePtr(UnityEngine.XR.WindowsMR.WindowsMREnvironment.OriginSpatialCoordinateSystem);

    sceneToUnityTransform = sceneCoordinateSystem.TryGetTransformTo(unityCoordinateSystem);

    if (sceneToUnityTransform != null)
    {
        sceneToUnityTransform = ConvertRightHandedMatrix4x4ToLeftHanded(sceneToUnityTransform.Value);
    }
    else
    {
        return null;
    }
            
    return sceneToUnityTransform;
}

それぞれの SceneObject に変換があります。この変換はそのオブジェクトに適用されます。 Unity では、右手の座標に変換し、ローカル変換をそうなるように次のように割り当てます。

private System.Numerics.Matrix4x4 ConvertRightHandedMatrix4x4ToLeftHanded(System.Numerics.Matrix4x4 matrix)
{
    matrix.M13 = -matrix.M13;
    matrix.M23 = -matrix.M23;
    matrix.M43 = -matrix.M43;

    matrix.M31 = -matrix.M31;
    matrix.M32 = -matrix.M32;
    matrix.M34 = -matrix.M34;

    return matrix;
}

 private void SetUnityTransformFromMatrix4x4(Transform targetTransform, System.Numerics.Matrix4x4 matrix, bool updateLocalTransformOnly = false)
 {
    if(targetTransform == null)
    {
        return;
    }

    Vector3 unityTranslation;
    Quaternion unityQuat;
    Vector3 unityScale;

    System.Numerics.Vector3 vector3;
    System.Numerics.Quaternion quaternion;
    System.Numerics.Vector3 scale;

    System.Numerics.Matrix4x4.Decompose(matrix, out scale, out quaternion, out vector3);

    unityTranslation = new Vector3(vector3.X, vector3.Y, vector3.Z);
    unityQuat        = new Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W);
    unityScale       = new Vector3(scale.X, scale.Y, scale.Z);

    if(updateLocalTransformOnly)
    {
        targetTransform.localPosition = unityTranslation;
        targetTransform.localRotation = unityQuat;
    }
    else
    {
        targetTransform.SetPositionAndRotation(unityTranslation, unityQuat);
    }
}

// Assume we have an SU object called suObject and a unity equivalent unityObject

System.Numerics.Matrix4x4 converted4x4LocationMatrix = ConvertRightHandedMatrix4x4ToLeftHanded(suObject.GetLocationAsMatrix());
SetUnityTransformFromMatrix4x4(unityObject.transform, converted4x4LocationMatrix, true);
        

四角形

四角形は、2D 配置シナリオに役立つ設計であり、2D キャンバス UX 要素の拡張機能と考えるべきです。 四角形は SceneObjects のコンポーネントであり、3D でレンダリングすることができますが、Quad API 自体では四角形は 2D 構造体と見なされます。 エクステント、図形などの情報を提供し、配置用の API を提供します。

四角形は四角形の範囲を持ちますが、任意の形状の 2D サーフェスを表します。 3D 環境の四角形と対話式操作するこれらの 2D サーフェスへの配置を有効にするため、この対話式操作を可能にするユーティリティが用意されています。 現在、Scene Understanding は FindCentermostPlacementGetSurfaceMask という 2 つの関数を提供します。 FindCentermostPlacement は、オブジェクトを配置できる四角形上の位置を検索する高レベルの API であり、指定した境界ボックスが基になるサーフェス上に残り続けるのを保証する、オブジェクトに最適な場所の検索を試みる API です。

Note

出力の座標は、他の Windows Rect 型と同様に、左上隅が (x = 0, y = 0) の四角形領域の四角形を基準にします。 独自のオブジェクトの元を操作する場合は、必ずこれを考慮してください。

次の例は、最も中心の配置可能な位置を検索し、ホログラムを四角形に固定する方法を示しています。

// This code assumes you already have a "Root" object that attaches the Scene's Origin.

// Find the first quad
foreach (var sceneObject in myScene.SceneObjects)
{
    // Find a wall
    if (sceneObject.Kind == SceneObjectKind.Wall)
    {
        // Get the quad
        var quads = sceneObject.Quads;
        if (quads.Count > 0)
        {
            // Find a good location for a 1mx1m object  
            System.Numerics.Vector2 location;
            if (quads[0].FindCentermostPlacement(new System.Numerics.Vector2(1.0f, 1.0f), out location))
            {
                // We found one, anchor something to the transform
                // Step 1: Create a new game object for the quad itself as a child of the scene root
                // Step 2: Set the local transform from quads[0].Position and quads[0].Orientation
                // Step 3: Create your hologram and set it as a child of the quad's game object
                // Step 4: Set the hologram's local transform to a translation (location.x, location.y, 0)
            }
        }
    }
}

手順 1 から 4 は、特定のフレームワークまたは実装に大幅に依存しますが、テーマは似ているはずです。 四角形は、スペースにローカライズされた境界付き 2D 平面を表す点に注意してください。 エンジンまたはフレームワークで四角形の位置を知り、オブジェクトを四角形に対して相対的にルート化することで、ホログラムは現実世界に対して正しく位置します。

メッシュ型

メッシュは、オブジェクトまたは環境の幾何学図形表現を表します。 空間マッピングと同様に、各空間サーフェス メッシュで提供されるメッシュ インデックスと頂点データは、すべての最新のレンダリング API で三角形メッシュをレンダリングするために使用される頂点バッファーとインデックス バッファーと同じ使い慣れたレイアウトを使用します。 頂点の位置は、Scene の座標系で提供されます。 このデータを参照するために使用される特定の API は次のとおりです。

void GetTriangleIndices(int[] indices);
void GetVertices(System.Numerics.Vector3[] vertices);

次のコードは、メッシュ構造から三角形リストを生成する例を示しています。

uint[] indices = new uint[mesh.TriangleIndexCount];
System.Numerics.Vector3[] positions = new System.Numerics.Vector3[mesh.VertexCount];

mesh.GetTriangleIndices(indices);
mesh.GetVertexPositions(positions);

インデックスまたは頂点バッファーは、>= インデックスまたは頂点数である必要がありますが、それ以外の場合は任意のサイズに設定して、効率的なメモリ再利用を可能にできます。

ColliderMesh

シーン オブジェクトは、Meshes プロパティと ColliderMeshes プロパティを介してメッシュおよびコライダー メッシュ データにアクセスできます。 これらのメッシュは常に一致します。つまり、Meshes プロパティの i 番目のインデックスは、ColliderMeshes プロパティの i 番目のインデックスと同じジオメトリを表します。 ランタイムまたはオブジェクトがコライダー メッシュをサポートしている場合は、最も低い順序の多角形、最も高い順序の近似値を取得することが保証されます。アプリケーションでコライダーを使用する場所がどこであっても、ColliderMeshes を使用するのが良い方法です。 システムがコライダーをサポートしていない場合、ColliderMeshes で返される Mesh オブジェクトは、メモリの制約を減らすメッシュと同じオブジェクトになります。

シーンの理解を使用して開発する

この時点で、シーンの理解ランタイムと SDK の主要な構成要素を理解したはずです。 機能と複雑さの大部分は、アクセス パターン、3D フレームワークとの対話式操作、ツールにあり、ツールは空間計画、ルーム分析、ナビゲーション、物理などのより高度なタスクを実行するためにこれらの API の上に記述できます。 これらをサンプルに取り込み、シナリオを際立たせるための適切な方向に導けることを願っています。 対処していないサンプルやシナリオがあればお知らせください。必要なドキュメントやプロトタイプを作成するよう努めます。

サンプル コードはどこで取得できますか。

Unity のサンプル コードについては、Unity のサンプル ページに関するページを参照してください。 このアプリケーションを使用すると、デバイスと通信してさまざまなシーン オブジェクトをレンダリングすることができます。または、シリアル化されたシーンを PC に読み込んで、デバイスを使用せずにシーンの理解を体験することができます。

サンプルシーンはどこで入手できますか。

HoloLens2 を持っている場合は、ComputeSerializedAsync の出力をファイルに保存し、必要に応じて逆シリアル化することで、キャプチャしたすべてのシーンを保存できます。

HoloLens2 デバイスを持っておらず、シーンの理解を操作したい場合は、キャプチャ済みシーンをダウンロードする必要があります。 現在、シーンの理解のサンプルにはシリアル化されたシーンが付属しています。これをダウンロードして、独自の便利な方法で使用できます。 次の場所で見つけることができます。

シーンの理解のサンプル シーン

関連項目