使用unity开发Hololens中的空间追踪功能
引入现实场景到游戏
目前,在 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
{
// 处理即将进入状态丢失时场景内容
}
}