通过代码配置网格观察程序 - MRTK2

本文介绍用于以编程方式配置空间感知系统和相关网格观察器数据提供程序的一些关键机制和 API。

访问网格观察器

实现 IMixedRealitySpatialAwarenessMeshObserver 接口的网格观察器类向空间感知系统提供特定于平台的网格数据。 可以在空间感知配置文件中配置多个观察器。

访问空间感知系统的数据提供程序的过程与访问任何其他混合现实工具包服务大致相同。 空间感知服务必须强制转换到 IMixedRealityDataProviderAccess 接口才能通过 GetDataProvider<T> API 进行访问,然后在运行时可以直接利用这些 API 访问网格观察器对象。

// 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.ResumeIMixedRealitySpatialAwarenessObserver.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 对象保存到资产文件中。

如果在设备上运行,可以使用许多社区和 Store 插件将 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
    }
}

请参阅