在运行时在MRTK2中启用/禁用空间映射

时间:2019-06-11 20:28:48

标签: c# mrtk

对于新的MRTK2,我希望在完成将其放置到GameObjects后禁用其空间映射。我被困在运行时在名称空间或服务中要执行的操作。

我尝试过:MixedRealityToolkit.SpatialAwarenessSystem.SuspendObservers(); 这没有作用。我可以禁用整个“空间感知系统” GameObject,但这将是一个hack。

我需要的是适当的调用,该调用将完全禁用系统,以便在不再有用时释放资源?

此外,对我们如何正确访问服务系统的一些见解将有很大帮助。

4 个答案:

答案 0 :(得分: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中的空间感知系统的更多文档

答案 1 :(得分:0)

我希望SuspendObservers()方法不会导致显示任何新的网格。悬浮后您看到网格了吗?

根据设计,网格将保持可见,直到应用程序通过IMixedRealitySpatialAwarenessMeshObserver.DisplayOption属性将其可见性显式设置为“无”为止。

谢谢!

答案 2 :(得分:0)

请注意,由于最近对MRTK框架进行了更改,因此先前的答案无效。

SpatialAwareness数据提供者链接here

从所述链接粘贴的代码:

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;
    }
}

答案 3 :(得分:0)

[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;
            }
        }
    }
}