1

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

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

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

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

4

4 回答 4

4

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

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 站点上阅读有关 MRTK 中空间感知系统的更多文档

于 2019-06-13T01:49:21.160 回答
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;
            }
        }
    }
}
于 2021-07-03T16:58:42.203 回答
0

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

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

谢谢!

于 2019-06-12T16:55:22.610 回答
0

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

此处为 SpatialAwareness DataProviders 的链接

从所述链接粘贴的代码:

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;
    }
}
于 2020-04-15T01:29:49.870 回答