处理异常情况
大多数情况下,WLT 可以静默地检测并修复跟踪错误,无需应用程序参与。
但某些异常情况会导致应用程序可能需要调整的错误。
跟踪丢失就是其中一种。
由于许多原因,跟踪可能在任何时候丢失。 可能是传感器被遮挡,光线可能不足,或者摄像头周围可能没有任何能被追踪的可见特征。
本文档的其他部分在概念级别上对这些异常情况进行了更全面的讨论,包括旨在缓解这些异常情况的 WLT 功能。
此处我们将深入研究应用程序开发人员如何(有选择地)利用这些功能,对应用程序在这些异常条件下的行为进行自定义。
AttachmentPoint
正如此处所详述的内容,附加点是 WLT 与应用程序之间的协定,用于通知已发生异常情况,以及应用程序可能用于响应的适当数据。
调节器组件
此类应用程序响应的实现以“调节器”组件的形式提供。 其中的主要组件是 AdjusterFixed 组件。
可以按原样使用 AdjusterFixed,但是理解它的作用是有指导意义的,特别是对于想要进一步对行为进行自定义的开发人员。
请务必认识到,调节器组件有两方面的作用:
- 此类组件管理基础 AttachmentPoint。
- 它们提供应用程序对异常情况的响应的实现。
AttachmentPoint 管理
检查 Start()
和 OnDestroy()
成员可以捕获所需的大部分 AttachmentPoint 管理信息。
在 Start()
上创建基础 AttachmentPoint,并将 AdjusterFixed 的成员函数作为回调(如下所示)。
在 OnDestroy()
中,这些回调连接被切断,并释放 AttachmentPoint。
情况处理回调
这两个回调在这些异常条件下实现应用程序所需的行为。
处理跟踪状态
在 HandleStateAdjust()
中,AdjusterFixed 组件禁用当前未跟踪的片段中包含的对象。
protected virtual void HandleAdjustState(AttachmentPointStateType state)
{
bool visible = state == AttachmentPointStateType.Normal;
if (visible != gameObject.activeSelf)
{
gameObject.SetActive(visible);
}
}
尽管这种简单的行为非常适合许多应用程序,但也很容易想到其不够完善的情况。
- 这些对象应该被隐藏,而不是被禁用(应持续更新)。
- 隐藏对象的替代方法是调整其优先级,例如将其移出远点剪切平面。
- 不应隐藏对象,而是使用不同的材质来呈现它,例如 X 射线材质。
- 应呈现备用对象,而不是隐藏对象。
- 等。
好在应用程序开发人员可以随意地实现这些行为中的任何一种,或者其他行为,只要能想到。
要指定自定义行为,最简单方法就是实现从 AdjusterFixed 派生的自定义组件。 然后可以继承 AttachmentPoint 管理,并重写处理程序以创建自定义行为。
处理重新定位
如概念文档中所述,WLT 系统可以通过将对象重新定位到冻结空间中,确定对象在物理世界中的最佳位置。 它将通过 AttachmentPoint 机制通知应用程序该情况。
当然,应用程序可以忽略此类调整。 但是,AdjusterFixed(和 AdjusterMoving)组件提供的行为是立即应用该重新定位转换。
protected virtual void HandleAdjustLocation(Pose adjustment)
{
Pose pose = gameObject.transform.GetGlobalPose();
pose = adjustment.Multiply(pose);
gameObject.transform.SetGlobalPose(pose);
}
这大概一直是应用程序所希望的。 那么可能会出现这样的问题:为什么有人想要重写 AdjusterFixed 的 HandlePositionAdjust()
函数?
当然,答案是应用程序除了要更正位置之外,可能还希望执行其他操作。 临时材料效果有助于让用户了解已进行的更改。 重新定位可能在几秒钟内完成。 或者,如果重新定位过于缓慢,应用程序可能希望弃用对象,而不是移动它。
AdjusterFixed 与 AdjusterMoving
AdjusterMoving 是从 AdjusterFixed 派生而来,仔细查看 AdjusterMoving,会发现它与 AdjusterFixed 几乎相同。
两者之间的区别是,AdjusterMoving 假设它的目标在环境中不断地被移动。 因此,每次更新时,它都会向 WLT 系统告知其新“姿态”。
AdjusterMoving 的成本主要是产生于添加 Update() 函数,而不是函数中完成的工作。 然而,对于“几乎”静止且只是很少从脚本中移动的对象,建议使用 AdjusterFixed 组件并在每次移动对象之后调用 。
自定义行为,但仅在需要时
同样,希望这个模式在整个 World Locking Tools 中都是一致的。 WLT 提供简单但通常有用的基线行为。 希望此实现将:
- 满足应用程序的需求。
- 提供用于增强的基线实现。
- 提供能让你尽情发挥的示例实现。