MRTK V2-在运行时启用/禁用空间映射

时间:2019-09-11 11:33:29

标签: unity3d augmented-reality hololens mrtk

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

我尝试过的事情:
1. this post中的此示例没有任何操作

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

2。每次尝试禁用可视化都会给我空引用。我猜GetObservers给出了空值,或者meshOserver给出了空值:

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

3。 mrtk在SpatialAwarenessMeshDemo场景中给出的示例显示了如何启动和停止观察者。一开始一切都很好,但是在暂停清除之后,观察者的整个空间图消失了,所以我的光标没有对准我的环境。因此,这不是我所需要的

   SpatialAwarenessSystem.ResumeObservers(); //start

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


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

enter image description here
enter image description here
我的代码以ResumeObservers开始空间映射,foreach循环为我提供了null引用,而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()结合显示选项{{1 }}。
3。 Nullreference (如果通过重写并将其强制转换为none来修复):

IMixedRealityDataProviderAccess

4。性能:要在启动观察者后恢复fps,您确实需要通过if (CoreServices.SpatialAwarenessSystem is IMixedRealityDataProviderAccess provider) { foreach (var observer in provider.GetDataProviders()) { if (observer is IMixedRealitySpatialAwarenessMeshObserver meshObs) { meshObs.DisplayOption = option; } } } 禁用系统,但这当然也会禁用空间地图,因此您无法再与之交互。 / p>

1 个答案:

答案 0 :(得分:1)

@Perazim,

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

该示例调用ClearObservations()来说明当时添加到Spatial Awareness系统的新功能。

请在GitHub(https://github.com/microsoft/MixedRealityToolkit-Unity/issues)上针对#1提交问题(Enable()和Disable()的失败会影响系统)。这些方法应具有广告宣传的功能。

谢谢! 大卫