MRTK V2 - Enable/Disable 运行时的空间映射

MRTK V2 - Enable/Disable Spatial Mapping at Runtime

我知道这个问题已经在这里问过两次了,但是答案并没有解决我的问题。我需要在运行时启用空间映射。扫描我的环境后,我想禁用它,或者至少隐藏多边形的可视化,这样我可以节省一些 fps。但是通过禁用空间映射,我仍然希望拥有我的环境的碰撞器。

我试过的:
1. 这个来自 this post 的例子 什么都没做 .

if (disable){
    // disable
    MixedRealityToolkit.SpatialAwarenessSystem.Disable();
}
else
{
    // enable
    MixedRealityToolkit.SpatialAwarenessSystem.Enable()
}

2。尝试禁用可视化每次都会给我一个 nullreference。我猜 GetObservers 返回 null 或者 meshOserver 是 null:

foreach(var observer in MixedRealityToolkit.SpatialAwarenessSystem.GetObservers())
{
    var meshObserver = observer as IMixedRealitySpatialAwarenessMeshObserver;
    if (meshObserver != null)
    {
        meshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
    }
}

3。 mrtk 在 SpatialAwarenessMeshDemo 场景中给出的示例显示了如何启动和停止观察者。通过启动一切正常,但是在 suspendingclearing 观察者之后,整个空间地图都消失了,所以我的光标没有与我的环境对齐。所以这不是我需要的

   SpatialAwarenessSystem.ResumeObservers(); //start

   SpatialAwarenessSystem.SuspendObservers();//stop
   SpatialAwarenessSystem.ClearObservations();


我现在拥有的:
我的 Spatial Awareness Profile 看起来像这样:



我的代码以 ResumeObservers 开始空间映射,foreach 循环给了我一个 nullreference 并且 SuspendObserver 被注释掉了,因为它禁用了整个空间映射:

        if (_isObserverRunning)
        {
            foreach (var observer in SpatialAwarenessSystem.GetObservers())
            {
                var meshObserver = observer as IMixedRealitySpatialAwarenessMeshObserver;
                if (meshObserver != null)
                {
                    meshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
                }
            }

            //SpatialAwarenessSystem.SuspendObservers();
            //SpatialAwarenessSystem.ClearObservations();
            _isObserverRunning = false;
        }
        else
        {
            SpatialAwarenessSystem.ResumeObservers();
            _isObserverRunning = true;
        }

问题:我如何以正确的方式启动和停止空间映射,以便我可以节省一些性能并仍然可以与空间映射的碰撞器进行交互。

我的规格
MRTK v2.0.0
Unity 2019.2.0f1
Visual Studio 2017

!--编辑--包含解决方案--!
1。使用选项 #1 我错了。它做了它的意思,但我用错了方式。例如,如果您在 运行 空间映射过程中禁用 SpatialAwarenessSystem,它将禁用整个过程,包括创建的空间地图。所以之后你就不能和环境互动了。
2。对我有用的 开始使用 ResumeObservers() 并结合显示选项设置为 visible 以及停止空间映射的方法 SuspendObservers() 结合显示选项 none.
3。 Nullreference 如果通过重写和强制转换为 IMixedRealityDataProviderAccess:

来修复
if (CoreServices.SpatialAwarenessSystem is IMixedRealityDataProviderAccess provider)
{
    foreach (var observer in provider.GetDataProviders())
    {
        if (observer is IMixedRealitySpatialAwarenessMeshObserver meshObs)
        {
            meshObs.DisplayOption = option;
        }
    }
}

4.性能: 要在启动观察器后恢复 fps,您确实需要通过 MixedRealityToolkit.SpatialAwarenessSystem.Disable(); 禁用系统,但这当然也会禁用空间地图,因此您无法再与其交互。

@Perazim,

该建议基于您的选项 #3。调用 ResumeObservers() 启动并调用 SuspendObservers() 停止。除非您希望将它们从场景中移除,否则无需调用 ClearObservations()。

该示例调用 ClearObservations() 来说明当时添加到空间感知系统的新功能。

请在 GitHub (https://github.com/microsoft/MixedRealityToolkit-Unity/issues) 上针对 #1(Enable() 和 Disable() 失败影响系统)提出问题。这些方法的行为应与宣传的一样。

谢谢! 大卫