使用unity开发Hololens中的空间追踪功能

2016年11月25日 14:58 1 点赞 0 评论 更新于 2025-11-21 20:52

引入现实场景到游戏

目前,在 HoloLens 上的几款游戏主要将现实中的地面与墙面引入游戏。现实房间的地板自然成为游戏的地面,而墙壁更多地被用作障碍。

追踪丢失(Tracking Loss)情况

当 HoloLens 设备无法识别自身在世界中的位置时,应用会出现追踪丢失(tracking loss)的情况。默认情况下,Unity 会暂停 Update 更新循环,并向用户显示一张闪屏图片。当设备重新恢复位置追踪时,闪屏图片会消失,并且 Update 循环将继续。

此外,用户也可以手动处理这个切换过程。在发生追踪丢失期间,如果不进行任何处理,场景中的所有全息内容将处于身体锁定(body - locked)状态。

默认处理方式(Default Handling)

默认情况下,在追踪丢失期间,应用的所有更新动作、事件和消息都会被暂停,同时应用会向用户显示一张图片。可以通过项目设置(Player settings -> Splash Image -> Holographic Tracking Loss image)选项来设置追踪丢失时要显示的图片。

手动处理(Manual Handling)

若要手动处理追踪丢失情况,需要在上述设置选项中取消勾选“Display tracking loss image”选项,之后使用特定的 API 来处理追踪状态变化。

相关命名空间和类型

  • 命名空间:UnityEngine.VR.WSA
  • 类型:WorldManager

WorldManager 提供了一个事件(WorldManager.OnPositionalLocatorStateChanged),用于识别追踪状态(追踪丢失/追踪可获取),同时还提供了一个属性(WorldManager.state)来查询当前追踪状态。

当追踪状态丢失时,场景中的相机将立即静止,不再移动,即使用户在运动。这意味着全息图形将不再响应用户物理位置的变化,所有内容都会相对于用户身体保持静止。

在手动处理追踪状态变化时,有两种方式:一是每一帧都查询当前追踪状态,二是处理 OnPositionalLocatorStateChanged 事件。

轮询(Polling)

追踪状态中最重要的状态是 PositionalLocatorState.Active,这表示当前 HoloLens 的状态追踪正常工作。任何其他状态都会导致摄像机只剩下旋转增量,而忽略位置变化。

以下是一个轮询的示例代码:

void Update()
{
switch (UnityEngine.VR.WSA.WorldManager.state)
{
case PositionalLocatorState.Active:
// 处理激活状态内容
break;
case PositionalLocatorState.Activating:
case PositionalLocatorState.Inhibited:
case PositionalLocatorState.OrientationOnly:
case PositionalLocatorState.Unavailable:
default:
// 摄像机当前只有旋转增量变化
break;
}
}

处理追踪状态变化事件(Handling the OnPositionalLocatorStateChanged event)

更便捷的方法是订阅状态追踪的 OnPositionalLocatorStateChanged 事件来处理:

void Start()
{
UnityEngine.VR.WSA.WorldManager.OnPositionalLocatorStateChanged += WorldManager_OnPositionalLocatorStateChanged;
}

private void WorldManager_OnPositionalLocatorStateChanged(PositionalLocatorState oldState, PositionalLocatorState newState)
{
if (newState == PositionalLocatorState.Active)
{
// 处理即将进入追踪恢复时场景内容
}
else
{
// 处理即将进入状态丢失时场景内容
}
}

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章