MRTK V2 - Enable/Disable 运行时的空间映射
MRTK V2 - Enable/Disable Spatial Mapping at Runtime
我知道这个问题已经在这里问过两次了,但是答案并没有解决我的问题。我需要在运行时启用空间映射。扫描我的环境后,我想禁用它,或者至少隐藏多边形的可视化,这样我可以节省一些 fps。但是通过禁用空间映射,我仍然希望拥有我的环境的碰撞器。
我试过的:
1. 这个来自 this post 的例子 什么都没做 .
if (disable){
// disable
MixedRealityToolkit.SpatialAwarenessSystem.Disable();
}
else
{
// enable
MixedRealityToolkit.SpatialAwarenessSystem.Enable()
}
2。尝试禁用可视化每次都会给我一个 nullreference。我猜 GetObservers
返回 null 或者 meshOserver
是 null:
foreach(var observer in MixedRealityToolkit.SpatialAwarenessSystem.GetObservers())
{
var meshObserver = observer as IMixedRealitySpatialAwarenessMeshObserver;
if (meshObserver != null)
{
meshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
}
}
3。 mrtk 在 SpatialAwarenessMeshDemo
场景中给出的示例显示了如何启动和停止观察者。通过启动一切正常,但是在 suspending 和 clearing 观察者之后,整个空间地图都消失了,所以我的光标没有与我的环境对齐。所以这不是我需要的。
SpatialAwarenessSystem.ResumeObservers(); //start
SpatialAwarenessSystem.SuspendObservers();//stop
SpatialAwarenessSystem.ClearObservations();
我现在拥有的:
我的 Spatial Awareness Profile
看起来像这样:
我的代码以 ResumeObservers
开始空间映射,foreach 循环给了我一个 nullreference 并且 SuspendObserver
被注释掉了,因为它禁用了整个空间映射:
if (_isObserverRunning)
{
foreach (var observer in SpatialAwarenessSystem.GetObservers())
{
var meshObserver = observer as IMixedRealitySpatialAwarenessMeshObserver;
if (meshObserver != null)
{
meshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
}
}
//SpatialAwarenessSystem.SuspendObservers();
//SpatialAwarenessSystem.ClearObservations();
_isObserverRunning = false;
}
else
{
SpatialAwarenessSystem.ResumeObservers();
_isObserverRunning = true;
}
问题:我如何以正确的方式启动和停止空间映射,以便我可以节省一些性能并仍然可以与空间映射的碰撞器进行交互。
我的规格:
MRTK v2.0.0
Unity 2019.2.0f1
Visual Studio 2017
!--编辑--包含解决方案--!
1。使用选项 #1 我错了。它做了它的意思,但我用错了方式。例如,如果您在 运行 空间映射过程中禁用 SpatialAwarenessSystem,它将禁用整个过程,包括创建的空间地图。所以之后你就不能和环境互动了。
2。对我有用的 开始使用 ResumeObservers()
并结合显示选项设置为 visible
以及停止空间映射的方法 SuspendObservers()
结合显示选项 none
.
3。 Nullreference 如果通过重写和强制转换为 IMixedRealityDataProviderAccess
:
来修复
if (CoreServices.SpatialAwarenessSystem is IMixedRealityDataProviderAccess provider)
{
foreach (var observer in provider.GetDataProviders())
{
if (observer is IMixedRealitySpatialAwarenessMeshObserver meshObs)
{
meshObs.DisplayOption = option;
}
}
}
4.性能: 要在启动观察器后恢复 fps,您确实需要通过 MixedRealityToolkit.SpatialAwarenessSystem.Disable();
禁用系统,但这当然也会禁用空间地图,因此您无法再与其交互。
@Perazim,
该建议基于您的选项 #3。调用 ResumeObservers() 启动并调用 SuspendObservers() 停止。除非您希望将它们从场景中移除,否则无需调用 ClearObservations()。
该示例调用 ClearObservations() 来说明当时添加到空间感知系统的新功能。
请在 GitHub (https://github.com/microsoft/MixedRealityToolkit-Unity/issues) 上针对 #1(Enable() 和 Disable() 失败影响系统)提出问题。这些方法的行为应与宣传的一样。
谢谢!
大卫
我知道这个问题已经在这里问过两次了,但是答案并没有解决我的问题。我需要在运行时启用空间映射。扫描我的环境后,我想禁用它,或者至少隐藏多边形的可视化,这样我可以节省一些 fps。但是通过禁用空间映射,我仍然希望拥有我的环境的碰撞器。
我试过的:
1. 这个来自 this post 的例子 什么都没做 .
if (disable){
// disable
MixedRealityToolkit.SpatialAwarenessSystem.Disable();
}
else
{
// enable
MixedRealityToolkit.SpatialAwarenessSystem.Enable()
}
2。尝试禁用可视化每次都会给我一个 nullreference。我猜 GetObservers
返回 null 或者 meshOserver
是 null:
foreach(var observer in MixedRealityToolkit.SpatialAwarenessSystem.GetObservers())
{
var meshObserver = observer as IMixedRealitySpatialAwarenessMeshObserver;
if (meshObserver != null)
{
meshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
}
}
3。 mrtk 在 SpatialAwarenessMeshDemo
场景中给出的示例显示了如何启动和停止观察者。通过启动一切正常,但是在 suspending 和 clearing 观察者之后,整个空间地图都消失了,所以我的光标没有与我的环境对齐。所以这不是我需要的。
SpatialAwarenessSystem.ResumeObservers(); //start
SpatialAwarenessSystem.SuspendObservers();//stop
SpatialAwarenessSystem.ClearObservations();
我现在拥有的:
我的 Spatial Awareness Profile
看起来像这样:
我的代码以 ResumeObservers
开始空间映射,foreach 循环给了我一个 nullreference 并且 SuspendObserver
被注释掉了,因为它禁用了整个空间映射:
if (_isObserverRunning)
{
foreach (var observer in SpatialAwarenessSystem.GetObservers())
{
var meshObserver = observer as IMixedRealitySpatialAwarenessMeshObserver;
if (meshObserver != null)
{
meshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
}
}
//SpatialAwarenessSystem.SuspendObservers();
//SpatialAwarenessSystem.ClearObservations();
_isObserverRunning = false;
}
else
{
SpatialAwarenessSystem.ResumeObservers();
_isObserverRunning = true;
}
问题:我如何以正确的方式启动和停止空间映射,以便我可以节省一些性能并仍然可以与空间映射的碰撞器进行交互。
我的规格:
MRTK v2.0.0
Unity 2019.2.0f1
Visual Studio 2017
!--编辑--包含解决方案--!
1。使用选项 #1 我错了。它做了它的意思,但我用错了方式。例如,如果您在 运行 空间映射过程中禁用 SpatialAwarenessSystem,它将禁用整个过程,包括创建的空间地图。所以之后你就不能和环境互动了。
2。对我有用的 开始使用 ResumeObservers()
并结合显示选项设置为 visible
以及停止空间映射的方法 SuspendObservers()
结合显示选项 none
.
3。 Nullreference 如果通过重写和强制转换为 IMixedRealityDataProviderAccess
:
if (CoreServices.SpatialAwarenessSystem is IMixedRealityDataProviderAccess provider)
{
foreach (var observer in provider.GetDataProviders())
{
if (observer is IMixedRealitySpatialAwarenessMeshObserver meshObs)
{
meshObs.DisplayOption = option;
}
}
}
4.性能: 要在启动观察器后恢复 fps,您确实需要通过 MixedRealityToolkit.SpatialAwarenessSystem.Disable();
禁用系统,但这当然也会禁用空间地图,因此您无法再与其交互。
@Perazim,
该建议基于您的选项 #3。调用 ResumeObservers() 启动并调用 SuspendObservers() 停止。除非您希望将它们从场景中移除,否则无需调用 ClearObservations()。
该示例调用 ClearObservations() 来说明当时添加到空间感知系统的新功能。
请在 GitHub (https://github.com/microsoft/MixedRealityToolkit-Unity/issues) 上针对 #1(Enable() 和 Disable() 失败影响系统)提出问题。这些方法的行为应与宣传的一样。
谢谢! 大卫