【发布时间】:2019-09-11 11:33:29
【问题描述】:
我知道这个问题已经在这里被问过两次,但答案并没有解决我的问题。我需要在运行时启用空间映射。扫描我的环境后,我想禁用它,或者至少隐藏多边形的可视化,这样我可以节省一些 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 循环给了我一个空引用,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(); 禁用系统,但这当然也会禁用空间地图,因此您无法再与之交互。
【问题讨论】:
-
你怎么知道尝试 1 什么也没做?
-
我在回答之前重试了它。我错了。它做了它的意思,但我用错了方式。我要更新我的帖子!
标签: unity3d augmented-reality hololens mrtk