MRTK V2 - 空间感知网格的可视化工作不正常
MRTK V2 - Visualization of Spatial Awareness Mesh is not working properly
在我的项目中,我使用了一个按钮来启用和禁用空间 mapping/awareness。它工作得很好,10 次中有 7 次。可以在其他 3 次中观察到以下行为。通过禁用空间地图网格(多边形),它们消失到 90%。但有 10% 的人留在原地。重复按下我的按钮(dis/enable 空间映射)没有帮助,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.
这似乎是一种竞争条件,网格检测到的逻辑不遵守观察者的状态(暂停或恢复)。感谢@Perazim 的问题!
我也遇到了这个问题。在 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
}
在我的项目中,我使用了一个按钮来启用和禁用空间 mapping/awareness。它工作得很好,10 次中有 7 次。可以在其他 3 次中观察到以下行为。通过禁用空间地图网格(多边形),它们消失到 90%。但有 10% 的人留在原地。重复按下我的按钮(dis/enable 空间映射)没有帮助,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.
这似乎是一种竞争条件,网格检测到的逻辑不遵守观察者的状态(暂停或恢复)。感谢@Perazim 的问题!
我也遇到了这个问题。在 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
}