【问题标题】:Enable/Disable Spatial Mapping at runtime in MRTK2在 MRTK2 运行时启用/禁用空间映射
【发布时间】:2021-07-04 00:58:42
【问题描述】:

在使用新的 MRTK2 放置游戏对象后,我希望禁用空间映射。我被困在命名空间或服务中究竟要调用什么以在运行时执行此操作。

我试过了:MixedRealityToolkit.SpatialAwarenessSystem.SuspendObservers(); 这没有效果。我可以禁用整个“空间感知系统”游戏对象,但这将是一个 hack。

我需要的是能够完全禁用系统以便在不再有用时释放资源的正确调用?

此外,了解我们如何正确访问服务系统会有很大帮助。

【问题讨论】:

    标签: c# mrtk


    【解决方案1】:

    您可以使用以下代码来禁用/启用空间感知系统:

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

    您可以使用以下代码仅启用/禁用可视化,但保持对撞机开启:

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

    您可以在mrtk github.io siteSpatial Awareness System Usage guide 上阅读有关 MRTK 中空间感知系统的更多文档

    【讨论】:

    • 谢谢你,朱莉娅。这很有帮助!
    • 嘿,我也在寻找在运行时启用/禁用空间映射。我尝试了上面的行,但它不会启动或停止空间映射,我不知道为什么。这条线对你有用吗?
    【解决方案2】:

    我本来希望 SuspendObservers() 方法不会显示新的网格。您看到暂停后网格发生变化了吗?

    在应用程序通过 IMixedRealitySpatialAwarenessMeshObserver.DisplayOption 属性明确将其可见性设置为无之前,网格保持可见是设计使然。

    谢谢!

    【讨论】:

    • 枚举 SpatialMeshDisplayOptions 在 MRTK 2.6 及更高版本中已更改为 SpatialAwarenessMeshDisplayOptions。
    【解决方案3】:

    请注意,由于最近对 MRTK 框架的更改,上一个答案不起作用。

    SpatialAwareness DataProvidershere的链接

    从上述链接粘贴的代码:

    IMixedRealityDataProviderAccess dataProviderAccess =
        CoreServices.SpatialAwarenessSystem as IMixedRealityDataProviderAccess;
    
    if (dataProviderAccess != null)
    {
        IReadOnlyList<IMixedRealitySpatialAwarenessMeshObserver> observers =
            dataProviderAccess.GetDataProviders<IMixedRealitySpatialAwarenessMeshObserver>();
    
        foreach (IMixedRealitySpatialAwarenessMeshObserver observer in observers)
        {
            // Set the mesh to use the occlusion material
            observer.DisplayOption = SpatialMeshDisplayOptions.Occlusion;
        }
    }
    

    【讨论】:

      【解决方案4】:
      [AddComponentMenu("Scripts/MRTK/Examples/ClearSpatialObservations")]
      public class ClearSpatialObservations : MonoBehaviour
      {
          /// <summary>
          /// Indicates whether observations are to be cleared (true) or if the observer is to be resumed (false).
          /// </summary>
          private bool clearObservations = true;
      
          /// <summary>
          /// Toggles the state of the observers.
          /// </summary>
          public void ToggleObservers()
          {
              var spatialAwarenessSystem = CoreServices.SpatialAwarenessSystem;
              if (spatialAwarenessSystem != null)
              {
                  if (clearObservations)
                  {
                      spatialAwarenessSystem.SuspendObservers();
                      spatialAwarenessSystem.ClearObservations();
                      clearObservations = false;
                  }
                  else
                  {
                      spatialAwarenessSystem.ResumeObservers();
                      clearObservations = true;
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-15
        相关资源
        最近更新 更多