空間認識システムデータプロバイダーの作成

空間認識システムは、実際の環境に関するデータをアプリケーションに提供するための拡張可能なシステムです。 新しいハードウェアプラットフォームまたは新しい形式の空間認識データのサポートを追加するには、カスタムデータプロバイダーが必要になることがあります。

この記事では、空間認識システムに対して、空間オブザーバーとも呼ばれる カスタムデータプロバイダーを作成する方法について説明します。 ここで示すコード例は、 SpatialObjectMeshObserver エディターで3d メッシュデータを読み込む場合に役立つクラスの実装です。

注意

この例で使用する完全なソースコードは、フォルダーにあり Assets/MRTK/Providers/ObjectMeshObserver ます。

名前空間とフォルダー構造

データプロバイダーは、次の2つの方法のいずれかで配布できます。

  1. サードパーティ製アドオン
  2. Microsoft Mixed Reality Toolkit の一部

新しいデータプロバイダーを MRTK に送信するための承認プロセスは、ケースごとに異なります。最初の提案の時点で伝達されます。 提案は、新しい 機能の要求 の種類の問題を作成することによって送信できます。

サードパーティアドオン

Namespace

潜在的な名前の競合を軽減するには、データプロバイダーに名前空間が必要です。 名前空間には、次のコンポーネントが含まれていることをお勧めします。

  • アドオンを生成する会社名
  • Feature area (機能領域)

たとえば、Contoso 社によって作成および出荷された空間認識データプロバイダーは、 "Toolkit MixedReality" である可能性があります。SpatialAwareness "

フォルダー構造

次の図に示すように、データプロバイダーのソースコードをフォルダー階層で整理することをお勧めします。

フォルダー構造の例

ContosoSpatialAwareness フォルダーにデータプロバイダーの実装が含まれている場合、 Editor フォルダーにはインスペクター (およびその他の Unity エディター固有のコード) が含まれ、 Profiles フォルダーには、事前に定義された1つ以上のプロファイル可能なオブジェクトが含まれています。

MRTK 送信

Namespace

空間認識システムデータプロバイダーが Mixed Reality Toolkit リポジトリに送信されている場合、名前空間は MixedReality で始まる 必要があり ます。Toolkit (例: MixedReality. Toolkit。SpatialObjectMeshObserver)

また、コードは MRTK/Providers (例: Mrtk/providers/ObjectMeshObserver) の下のフォルダーに配置する必要があります。

フォルダー構造

すべてのコードは、MRTK/Providers の下のフォルダー (例: MRTK/Providers/ObjectMeshObserver) に配置する必要があります。

空間データオブジェクトを定義する

空間認識データプロバイダーを作成する最初の手順では、アプリケーションに提供するデータ (例: メッシュまたは平面) の種類を決定します。

すべての空間データオブジェクトは、インターフェイスを実装する必要があり IMixedRealitySpatialAwarenessObject ます。

Mixed Reality Toolkit foundation には、新しいデータプロバイダーで使用または拡張できる次の空間オブジェクトが用意されています。

データプロバイダーを実装する

インターフェイスまたは基本クラスの継承を指定する

すべての空間認識データプロバイダーは、 IMixedRealitySpatialAwarenessObserver 空間認識システムに必要な最小限の機能を指定するインターフェイスを実装する必要があります。 MRTK foundation には、 BaseSpatialObserver この必要な機能の既定の実装を提供するクラスが含まれています。

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

注意

IMixedRealityCapabilityCheckインターフェイスは、 SpatialObjectMeshObserver SpatialAwarenessMesh 機能がサポートされていることを示すためにクラスによって使用されます。

MixedRealityDataProvider 属性を適用する

空間認識データプロバイダーを作成するための重要な手順は、属性をクラスに適用することです MixedRealityDataProvider 。 この手順では、データプロバイダーの既定のプロファイルとプラットフォーム (空間認識プロファイルで選択されている場合) と、名前、フォルダーパスなどを設定できます。

[MixedRealityDataProvider(
    typeof(IMixedRealitySpatialAwarenessSystem),
    SupportedPlatforms.WindowsEditor | SupportedPlatforms.MacEditor | SupportedPlatforms.LinuxEditor,
    "Spatial Object Mesh Observer",
    "ObjectMeshObserver/Profiles/DefaultObjectMeshObserverProfile.asset",
    "MixedRealityToolkit.Providers")]
public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

IMixedRealityDataProvider メソッドを実装する

クラスが定義されたら、次の手順として、インターフェイスの実装を提供し IMixedRealityDataProvider ます。

注意

クラスは、クラスを使用して、 BaseSpatialObserver BaseService メソッドに対して空の実装のみを提供し IMixedRealityDataProvider ます。 これらのメソッドの詳細は、一般にデータプロバイダーに固有のものです。

データプロバイダーによって実装されるメソッドは次のとおりです。

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

データプロバイダーのロジックを実装する

次の手順では、特定のデータプロバイダーインターフェイスを実装することによって、データプロバイダーのロジックを追加します。たとえば、のように IMixedRealitySpatialAwarenessMeshObserver します。 データプロバイダーのこの部分は、通常、プラットフォーム固有です。

監視の変更通知

デバイスでの環境の理解における変更にアプリケーションが応答できるようにするために、データプロバイダーは、インターフェイスで定義されているように通知イベントを発生させ IMixedRealitySpatialAwarenessObservationtHandler<T> ます。

  • OnObservationAdded()
  • OnObservationRemoved()
  • OnObservationUpdated()

次の例のコードは、 SpatialObjectMeshObserver メッシュデータが追加されたときの発生とイベントを示しています。

// The data to be sent when mesh observation events occur.
// This member variable is initialized as part of the Initialize() method.
private MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> meshEventData = null;

/// <summary>
/// Sends the observations using the mesh data contained within the configured 3D model.
/// </summary>
private void SendMeshObjects()
{
    if (!sendObservations) { return; }

    if (spatialMeshObject != null)
    {
        MeshFilter[] meshFilters = spatialMeshObject.GetComponentsInChildren<MeshFilter>();
        for (int i = 0; i < meshFilters.Length; i++)
        {
            SpatialAwarenessMeshObject meshObject = SpatialAwarenessMeshObject.Create(
                meshFilters[i].sharedMesh,
                MeshPhysicsLayer,
                $"Spatial Object Mesh {currentMeshId}",
                currentMeshId,
                ObservedObjectParent);

            meshObject.GameObject.transform.localPosition = meshFilters[i].transform.position;
            meshObject.GameObject.transform.localRotation = meshFilters[i].transform.rotation;

            ApplyMeshMaterial(meshObject);

            meshes.Add(currentMeshId, meshObject);

            // Initialize the meshEventData variable with data for the added event.
            meshEventData.Initialize(this, currentMeshId, meshObject);
            // Raise the event via the spatial awareness system.
            SpatialAwarenessSystem?.HandleEvent(meshEventData, OnMeshAdded);

            currentMeshId++;
        }
    }

    sendObservations = false;
}

注意

SpatialObjectMeshObserver OnObservationUpdated 3d モデルは一度だけ読み込まれるため、クラスはイベントを発生させません。 クラスの実装は、 WindowsMixedRealitySpatialMeshObserver 観察され OnObservationUpdated たメッシュのイベントを発生させる例を提供します。

Unity Profiler インストルメンテーションの追加

混合現実アプリケーションでは、パフォーマンスが重要です。 すべてのコンポーネントによって、アプリケーションで考慮する必要があるオーバーヘッドが増加します。 このため、すべての空間認識データプロバイダーには、内部ループの Unity プロファイラーインストルメンテーションと頻繁に使用されるコードパスが含まれていることが重要です。

カスタムプロバイダーをインストルメント化するときに、MRTK によって使用されるパターンを実装することをお勧めします。

        private static readonly ProfilerMarker UpdateObserverPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealitySpatialMeshObserver.UpdateObserver");

        /// <summary>
        /// Requests updates from the surface observer.
        /// </summary>
        private void UpdateObserver()
        {
            using (UpdateObserverPerfMarker.Auto())
            {
                // Code to be measured.
            }
        }

注意

プロファイラーマーカーを識別するために使用される名前は任意です。 MRTK では、次のパターンを使用します。

"[product] className. methodName-省略可能なメモ"

カスタムデータプロバイダーは、トレースを分析するときに特定のコンポーネントとメソッドを簡単に識別できるように、同様のパターンに従うことをお勧めします。

プロファイルとインスペクターを作成する

Mixed Reality Toolkit では、データプロバイダーはプロファイルを使用して構成されます。

プロファイルを定義する

プロファイルの内容は、データプロバイダーのアクセス可能なプロパティ (例: 更新間隔) を反映させる必要があります。 各インターフェイスに定義されているすべてのユーザー構成可能なプロパティは、プロファイルに含まれている必要があります。

新しいデータプロバイダーによって既存のプロバイダーが拡張される場合は、基本クラスをお勧めします。 たとえば、はを拡張して、 SpatialObjectMeshObserverProfile MixedRealitySpatialAwarenessMeshObserverProfile 顧客が環境データとして使用する3d モデルを提供できるようにします。

[CreateAssetMenu(
    menuName = "Mixed Reality Toolkit/Profiles/Spatial Object Mesh Observer Profile",
    fileName = "SpatialObjectMeshObserverProfile",
    order = 100)]
public class SpatialObjectMeshObserverProfile : MixedRealitySpatialAwarenessMeshObserverProfile
{
    [SerializeField]
    [Tooltip("The model containing the desired mesh data.")]
    private GameObject spatialMeshObject = null;

    /// <summary>
    /// The model containing the desired mesh data.
    /// </summary>
    public GameObject SpatialMeshObject => spatialMeshObject;
}

CreateAssetMenu属性をプロファイルクラスに適用することにより、顧客は [資産の 作成 > > ] [Mixed Reality Toolkit > プロファイル] メニューを使用してプロファイルインスタンスを作成できるようになります。

インスペクターを実装する

プロファイルインスペクターは、プロファイルの内容を構成および表示するためのユーザーインターフェイスです。 各プロファイルインスペクターは、クラスを拡張する必要があり BaseMixedRealityToolkitConfigurationProfileInspector ます。

属性は、 CustomEditor インスペクターが適用される資産の種類を Unity に通知します。

[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

アセンブリ定義の作成

Mixed Reality Toolkit は、アセンブリ定義 (asmdef) ファイルを使用して、コンポーネント間の依存関係を指定するだけでなく、コンパイル時間の短縮に Unity を支援します。

すべてのデータプロバイダーとそのエディターコンポーネントに対してアセンブリ定義ファイルを作成することをお勧めします。

前の例の フォルダー構造 を使用して、ContosoSpatialAwareness データプロバイダー用に2つの asmdef ファイルがあります。

最初のアセンブリ定義は、データプロバイダー用です。 この例では、ContosoSpatialAwareness と呼ばれ、例の ContosoSpatialAwareness フォルダーに配置されます。 このアセンブリ定義では、MixedReality に対する依存関係を指定する必要があります。Toolkit と、それが依存するその他のアセンブリ。

ContosoInputEditor アセンブリ定義では、プロファイルインスペクターとエディター固有のコードを指定します。 このファイルは、エディターコードのルートフォルダーに配置する必要があります。 この例では、ファイルは ContosoSpatialAwareness\Editor フォルダーにあります。 このアセンブリ定義には、ContosoSpatialAwareness アセンブリへの参照と、次のものが含まれます。

  • MixedReality。Toolkit
  • MixedReality。Toolkit。エディターのインスペクター
  • MixedReality。Toolkit。エディター. ユーティリティ

データプロバイダーを登録する

作成されたデータプロバイダーは、アプリケーションで使用される空間認識システムに登録できます。

空間オブジェクトメッシュオブザーバーの選択

パッケージ化と配布

サードパーティのコンポーネントとして配布されるデータプロバイダーは、開発者の好みに応じて、パッケージ化と配布に関する具体的な詳細を提供します。 多くの場合、最も一般的な解決策は、unitypackage を生成し、Unity 資産ストア経由で配布することです。

データプロバイダーが microsoft Mixed Reality Toolkit パッケージの一部として送信され、受け入れられた場合、microsoft mrtk チームは mrtk オファリングの一部としてパッケージ化して配布します。

関連項目