透過程式碼設定網格觀察者 — MRTK2
本文將討論一些主要機制和 API,以程式設計方式設定 空間感知系統和 相關的 Mesh 觀察者 資料提供者。
存取網格觀察者
實作 介面的 IMixedRealitySpatialAwarenessMeshObserver
Mesh 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 觀察者 IMixedRealitySpatialAwarenessMeshObserver
已知的網格。
如果在編輯器中執行,則可以使用 AssetDatabase.CreateAsset()
將 物件儲存 Mesh
至資產檔案。
如果在裝置上執行,有許多社群和存放外掛程式可用來將資料序列化 MeshFilter
為模型檔案類型。
// 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 Observation 事件接聽的簡化範例。
// 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
}
}