我知道这个问题已经在这里被问过两次了,但是答案并不能解决我的问题。我需要在运行时启用空间映射。扫描环境后,我想禁用它,或者至少隐藏多边形的可视化,这样我可以保存一些fps。但是通过禁用空间贴图,我仍然希望拥有环境的碰撞器。
我尝试过的事情:
1. this post中的此示例没有任何操作。
if (disable){
// disable
MixedRealityToolkit.SpatialAwarenessSystem.Disable();
}
else
{
// enable
MixedRealityToolkit.SpatialAwarenessSystem.Enable()
}
2。每次尝试禁用可视化都会给我空引用。我猜GetObservers
给出了空值,或者meshOserver
给出了空值:
foreach(var observer in MixedRealityToolkit.SpatialAwarenessSystem.GetObservers())
{
var meshObserver = observer as IMixedRealitySpatialAwarenessMeshObserver;
if (meshObserver != null)
{
meshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
}
}
3。 mrtk在SpatialAwarenessMeshDemo
场景中给出的示例显示了如何启动和停止观察者。一开始一切都很好,但是在暂停和清除之后,观察者的整个空间图消失了,所以我的光标没有对准我的环境。因此,这不是我所需要的。
SpatialAwarenessSystem.ResumeObservers(); //start
SpatialAwarenessSystem.SuspendObservers();//stop
SpatialAwarenessSystem.ClearObservations();
我现在拥有的是
我的Spatial Awareness Profile
看起来像这样:
我的代码以ResumeObservers
开始空间映射,foreach循环为我提供了null引用,而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()
结合显示选项{{1 }}。
3。 Nullreference (如果通过重写并将其强制转换为none
来修复):
IMixedRealityDataProviderAccess
4。性能:要在启动观察者后恢复fps,您确实需要通过if (CoreServices.SpatialAwarenessSystem is IMixedRealityDataProviderAccess provider)
{
foreach (var observer in provider.GetDataProviders())
{
if (observer is IMixedRealitySpatialAwarenessMeshObserver meshObs)
{
meshObs.DisplayOption = option;
}
}
}
禁用系统,但这当然也会禁用空间地图,因此您无法再与之交互。 / p>
答案 0 :(得分:1)
@Perazim,
建议基于您的选项#3。调用ResumeObservers()启动,然后调用SuspendObservers()停止。除非您希望将它们从场景中删除,否则无需调用ClearObservations()。
该示例调用ClearObservations()来说明当时添加到Spatial Awareness系统的新功能。
请在GitHub(https://github.com/microsoft/MixedRealityToolkit-Unity/issues)上针对#1提交问题(Enable()和Disable()的失败会影响系统)。这些方法应具有广告宣传的功能。
谢谢! 大卫