コードを使用したメッシュ オブザーバーの構成 - MRTK2

この記事では、空間認識システムと関連するメッシュ オブザーバー データ プロバイダーをプログラムで構成するための主要なメカニズムと API のいくつかについて説明します。

メッシュ オブザーバーへのアクセス

IMixedRealitySpatialAwarenessMeshObserver インターフェイスを実装するメッシュ オブザーバー クラスでは、空間認識システムにプラットフォーム固有のメッシュ データを提供します。 空間認識プロファイルでは、複数のオブザーバーを構成できます。

空間認識システムのデータ プロバイダーへのアクセスは、他の Mixed Reality Toolkit サービスの場合とほとんど同じです。 空間認識サービスは、GetDataProvider<T> API を介してアクセスするために IMixedRealityDataProviderAccess インターフェイスにキャストする必要があります。これは、実行時にメッシュ オブザーバー オブジェクトに直接アクセスするために使用できます。

// Use CoreServices to quickly get access to the IMixedRealitySpatialAwarenessSystem
var spatialAwarenessService = CoreServices.SpatialAwarenessSystem;

// Cast to the IMixedRealityDataProviderAccess to get access to the data providers
var dataProviderAccess = spatialAwarenessService as IMixedRealityDataProviderAccess;

var meshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

以下に示すように、CoreServices.GetSpatialAwarenessSystemDataProvider<T>() ヘルパーによってこのアクセス パターンが簡略化されます。

// Get the first Mesh Observer available, generally we have only one registered
var meshObserver = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Get the SpatialObjectMeshObserver specifically
var meshObserverName = "Spatial Object Mesh Observer";
var spatialObjectMeshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

メッシュ監視の開始と停止

空間認識システムを処理する際の最も一般的なタスクの 1 つは、実行時に機能を動的にオフまたはオンに切り替えることです。 これは、IMixedRealitySpatialAwarenessObserver.Resume および IMixedRealitySpatialAwarenessObserver.Suspend API を使用して、オブザーバーごとに実行されます。

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Suspends observation of spatial mesh data
observer.Suspend();

// Resumes observation of spatial mesh data
observer.Resume();

このコード機能は、空間認識システムを介して直接アクセスすることで簡略化することもできます。

var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

すべてのメッシュ監視の開始と停止

一般に、アプリケーションですべてのメッシュ監視を開始/停止すると便利です。 これは、便利な空間認識システム API (ResumeObservers() および SuspendObservers()) を使用して実現できます。

// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();

// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();

メッシュの列挙とアクセス

メッシュへのアクセスは、オブザーバーごとに実行できます。その後、IMixedRealitySpatialAwarenessMeshObserver API を介してそのメッシュ オブザーバーが認識しているメッシュを列挙します。

エディターで実行している場合は、AssetDatabase.CreateAsset() を使用して Mesh オブジェクトをアセット ファイルに保存できます。

デバイスで実行されている場合、MeshFilter データをモデル ファイルの種類 (OBJ の例) にシリアル化するために使用できるコミュニティおよびストアのプラグインが多数あります。

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Loop through all known Meshes
foreach (SpatialAwarenessMeshObject meshObject in observer.Meshes.Values)
{
    Mesh mesh = meshObject.Filter.mesh;
    // Do something with the Mesh object
}

空間メッシュの表示と非表示

以下のサンプル コードを使用すると、プログラムでメッシュを非表示にしたり、表示したりすることができます。

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Set to not visible
observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;

// Set to visible and the Occlusion material
observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.Occlusion;

メッシュ監視イベントの登録

コンポーネントは、IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> を実装した後に、メッシュ監視イベントを受信するために空間認識システムに登録することができます。

DemoSpatialMeshHandler (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) スクリプトは、メッシュ オブザーバー イベントをリッスンするための役に立つ例と開始点です。

これは、DemoSpatialMeshHandler スクリプトとメッシュ監視イベントのリスニングの簡単な例です。

// Simplify type
using SpatialAwarenessHandler = IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>;

public class MyMeshObservationExample : MonoBehaviour, SpatialAwarenessHandler
{
    private void OnEnable()
    {
        // Register component to listen for Mesh Observation events, typically done in OnEnable()
        CoreServices.SpatialAwarenessSystem.RegisterHandler<SpatialAwarenessHandler>(this);
    }

    private void OnDisable()
    {
        // Unregister component from Mesh Observation events, typically done in OnDisable()
        CoreServices.SpatialAwarenessSystem.UnregisterHandler<SpatialAwarenessHandler>(this);
    }

    public virtual void OnObservationAdded(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }

    public virtual void OnObservationUpdated(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }

    public virtual void OnObservationRemoved(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }
}

関連項目