【问题标题】:MRTK V2 - Enable/Disable Spatial Mapping at RuntimeMRTK V2 - 在运行时启用/禁用空间映射
【发布时间】:2019-09-11 11:33:29
【问题描述】:

我知道这个问题已经在这里被问过两次,但答案并没有解决我的问题。我需要在运行时启用空间映射。扫描我的环境后,我想禁用它,或者至少隐藏多边形的可视化,这样我可以节省一些 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 循环给了我一个空引用,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(); 禁用系统,但这当然也会禁用空间地图,因此您无法再与之交互。

【问题讨论】:

  • 你怎么知道尝试 1 什么也没做?
  • 我在回答之前重试了它。我错了。它做了它的意思,但我用错了方式。我要更新我的帖子!

标签: unity3d augmented-reality hololens mrtk


【解决方案1】:

@Perazim,

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

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

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

谢谢! 大卫

【讨论】:

  • 我通过使用启动“ResumeObservers()”并结合将显示选项设置为“可见”和停止空间映射方法“SuspendObservers()”结合显示选项“无”来重试它'。我觉得自己很愚蠢,因为一开始我想写信给你,'SuspendObservers()' 带走了整个空间映射的东西。但我重试了,它符合我的目的。空间图还在,观察者暂停。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
相关资源
最近更新 更多