附加点

首先,World Locking Tools 提供了稳定的世界锁定坐标系:世界锁定空间。 这个空间相对于物质世界尽可能保持固定。 世界锁定空间内的对象所享受的功能需要这样一个稳定的参照系,例如保持与其他虚拟对象的相对布局、模拟自然物理定律、运动学和其他动画技术。

事实上,根据应用程序的需求,世界锁定的空间可能足以满足部分或所有场景内容。

但是,虽然世界锁定空间将与物理空间保持最佳一致性,但是在我们后文会介绍的部分情况下,世界锁定空间中的多个点不可能同时保持在共同坐标空间的固定性以及相对于物理世界中的参考点的固定性。

这里介绍一个简单但具有启发性的例子,假设传感器将一个定位点映射到位置 (3,0,0),将另一个定位点映射到位置 (-3,0,0)。 稍后,处理传感器优化时,已确定两个坐标应为 (3,0,0) 和 (-2,0,0)。 显然,没有可应用于摄像头的旋转和偏移来将两个定位点之间六米的距离转换为五米的偏移。

使用 Unity 的空间定位点系统,这两个定位点只会以无提示的方式移动到其新扫描的位置。

但 World Locking Tools 能保证,在世界锁定空间内,“几乎”永远不会移动非移动对象。 事实上,任何动作都由拥有的应用程序决定。

另一个常见的“异常”情况是跟踪丢失。 当在一个环境(例如房间)中丢失跟踪又在其他环境重新获取跟踪时,最初是没有链接这两个空间的信息的。 相对于一个空间中的坐标而言,另一个空间中的坐标是没有意义的。 使用附加点范例,应用程序可以在旧空间的空间信息未知时适当地处理初始阶段(例如通过在旧空间中隐藏对象),并在两个空间之间的空间关系已知时进行恢复。

可以进一步讨论这些特殊情况以及 WLT 为处理这些情况而执行的调整操作。 此处的讨论侧重于 WLT 与应用程序之间关于顺利处理此类情况的协定。

附加点是 World Locking Tools 与应用程序之间的协定的要点。 应用程序使用 World Locking Tools API 创建和定位附加点。 当调整操作确定附加点的位置更正时,将通过回调世界锁定空间中的新位置来通知应用程序,会将附加点保持在物理空间中的旧位置。

World Locking Tools 附加点可能成为解决方案的部分情况:

  • 与相对于其他虚拟对象相比,相对于物理世界保持固定更加重要。
  • 对象在运行时被放置在世界中,而不是在设计时放置在 Unity 中,因此协调跟踪中断所分离的相对位置可能非常重要(请参阅片段讨论)。
  • 请务必根据对象的物理空间定位的有效性管理对象的可见性。

使用附加点

附加点的用法非常简单。

客户端职责

对于所需的每个附加点,客户端必须:

  1. 从系统请求附加点。 请参阅 CreateAttachmentPoint
  2. 释放不再需要的附加点。 请参阅 ReleaseAttachmentPoint
  3. 告知系统附加点的初始位置和移动情况。 请参阅 CreateAttachmentPointMoveAttachmentPointTeleportAttachmentPoint
  4. 处理调整操作事件。 请参阅下文。

World Locking Tools 职责

发生以下任一情况时,World Locking Tools 会针对每个受影响的附加点向应用程序发出通知:

  1. 附加点的物理世界跟踪更改的有效性。
  2. 它在世界锁定空间中的坐标由于调整操作而改变,调整操作可能是片段合并再冻结

这些通知通过委托进行广播,应用程序在创建附加点时将委托发送给 WorldLockingManager。

如何以最佳方式处理这些通知由应用程序决定,因为其中的注意事项各不相同。 提供了供内部使用的示例处理程序,它们可以直接使用,也可以作为自定义实现的起点。

示例实现

对于在物理世界中保持固定且当跟踪无效时应隐藏其内容的附加点,AdjusterFixed 将通过 HandleAdjustState 成员实现 AdjustStateDelegate 并通过 HandleAdjustLocation 成员实现 AdjustLocationDelegateAdjusterMoving 中有用于移动对象的类似组件。

值得注意的是,可以选择提供其中一个或同时提供这两个委托,事实上,对状态和位置更改的反应可能基于轮询而不是事件实现。 但是,除非由于应用程序的具体情况而无法使用它们,否则使用委托的基于事件的系统会形成更高效的实现。

建议从 AdjusterFixed 组件(或非常类似的 AdjusterMoving)开始,并修改 HandleAdjustLocationHandleAdjustState 处理程序以满足应用程序需求。

另请参阅