透過程式碼設定網格觀察者 — MRTK2

本文將討論一些主要機制和 API,以程式設計方式設定空間感知系統和相關Mesh觀察者資料提供者。

存取網格觀察者

Mesh實作 介面的 IMixedRealitySpatialAwarenessMeshObserver Observer 類別,可為空間感知系統提供平臺特定的網格資料。 您可以在空間感知設定檔中設定多個觀察者。

存取空間感知系統的資料提供者,與任何其他Mixed Reality工具組服務大致相同。 空間感知服務必須轉換成 IMixedRealityDataProviderAccess 介面,才能透過 GetDataProvider<T> API 存取,然後可用來直接在執行時間存取Mesh Observer 物件。

// 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);

開始和停止網格觀察

處理空間感知系統時,最常見的工作之一是在執行時間動態關閉/開啟功能。 這會透過 和 IMixedRealitySpatialAwarenessObserver.Suspend API 針對 IMixedRealitySpatialAwarenessObserver.Resume 每個觀察者完成。

// 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();

列舉和存取網格

每個觀察者都可以存取網格,然後透過 API Mesh Observer IMixedRealitySpatialAwarenessMeshObserver 已知的網格來列舉。

如果在編輯器中執行,則可以使用 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> 作 ,然後向空間感知系統註冊,以接收Mesh觀察事件。

DemoSpatialMeshHandler (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) 腳本是一個實用的範例和起點,可用來接聽Mesh Observer 事件。

這是DemoSpatialMeshHandler腳本和Mesh觀察事件接聽的簡化範例。

// 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
    }
}

另請參閱