【问题标题】:MRTK V2 - Visualization of Spatial Awareness Mesh is not working properlyMRTK V2 - 空间感知网格的可视化无法正常工作
【发布时间】:2019-10-30 15:10:09
【问题描述】:

在我的项目中,我使用了一个启用和禁用空间映射/感知的按钮。它工作得很好,10 次中有 7 次。在其他 3 次中可以观察到以下行为。通过禁用空间地图网格(多边形),它们消失到 90%。但是 10% 保持在原来的位置。重复按下我的按钮(禁用/启用空间映射)没有帮助,10% 只是停留。有什么建议可能是这种行为的原因吗?

代码观察员:

public void ToggleObservers()
{
    if (SpatialAwarenessSystem == null) return;

    // If running → stop "running"
    if (_isObserverRunning)
    {
        SetVisualizationOfSpatialMapping(SpatialAwarenessMeshDisplayOptions.None);
        SpatialAwarenessSystem.SuspendObservers();
        _isObserverRunning = false;

        // Disabling the whole system boosts performance ~+5fps
        if (ShouldSpatialSystemBeDisabled)
            SpatialAwarenessSystem.Disable();

    }// Else start spatial mapping
    else
    {
        SpatialAwarenessSystem.Enable();
        SetVisualizationOfSpatialMapping(SpatialAwarenessMeshDisplayOptions.Visible);
        SpatialAwarenessSystem.ResumeObservers();
        _isObserverRunning = true;
    }
}

空间映射的代码集可视化:

public void SetVisualizationOfSpatialMapping(SpatialAwarenessMeshDisplayOptions option)
{
    if (CoreServices.SpatialAwarenessSystem is IMixedRealityDataProviderAccess provider)
    {
        foreach (var observer in provider.GetDataProviders())
        {
            if (observer is IMixedRealitySpatialAwarenessMeshObserver meshObs)
            {
                meshObs.DisplayOption = option;
            }
        }
    }
}

编辑: 错误Report on Github.

【问题讨论】:

标签: unity3d augmented-reality hololens mrtk


【解决方案1】:

我也遇到了这个问题。在 MRTK 中修复此问题之前,您可以修补此问题。

编辑此文件:

MixedRealityToolkit.Providers\WindowsMixedReality\WindowsMixedRealitySpatialMeshObserver.cs

找到挂起函数,在 // Begin Patch 和 // End Patch 之间添加代码:

public override void Suspend()
{
    #if UNITY_WSA
    if (!IsRunning)
    {
        Debug.LogWarning("The Windows Mixed Reality spatial observer is currently stopped.");
        return;
    }

    // UpdateObserver keys off of this value to stop observing.
    IsRunning = false;

    // Clear any pending work.
    meshWorkQueue.Clear();

    // Begin Patch
    if (outstandingMeshObject != null)
    {
        ReclaimMeshObject(outstandingMeshObject);
        outstandingMeshObject = null;
    }
    // End Patch
    #endif // UNITY_WSA
}

【讨论】:

    【解决方案2】:

    这似乎是一种竞争条件,其中网格检测到的逻辑不尊重观察者的状态(暂停或恢复)。感谢@Perazim 的问题!

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2023-04-08
      • 2016-04-30
      • 1970-01-01
      相关资源
      最近更新 更多