调整操作

系统确定重新定位场景中的某些对象可以更好地将这些对象与其物理世界定位点对齐时,将会使用 World Locking Tools 中的调整操作。

本部分将尝试进一步探讨需要使用调整操作的情况,以及该操作本身的机制。

特此强调,调整操作不常发生。 触发再冻结操作的默认容错可由应用程序自定义,但通常混合现实环境仅在特殊情况下才会触发再冻结操作。 可能导致再冻结需要的情况包括:

  • 环境恶劣导致跟踪丢失。
  • 头部快速移动,影响环境扫描。
  • 动态环境。
  • 回环(即在迂回的路径上积累跟踪错误,从而回到以前访问过的位置)。

这些问题的根本原因在于跟踪不佳,即跟踪错误。 如果环境良好且生成的跟踪效果良好,特别是在对空间进行初始扫描之后,将极少出现调整操作。

片段合并

许多情况可能导致出现多个片段,最常见的原因是跟踪暂时丢失。 片段是指共享公共坐标空间的对象的集合,但是其中一个片段的坐标空间相对于另一个片段的位置是不确定的。

如果接收并处理足够多新的传感器数据,使两个先前不相关的片段中的内容可以在同一空间中相对于彼此准确定位,则可执行片段合并。

两个(或多个)片段中的内容将合并到新的坐标空间是任意的。 请注意,最终的坐标空间将是其中任一空间,这只是相关的,因为这意味着要合并的所有片段(目标片段除外)都需要调整其坐标。 选为最终合并目标的片段中的内容不会受到影响。

系统会为每个要合并的源片段计算调整转换。 这些片段中每个附加点的 AdjustLocationDelegate 将随调整转换一起调用。 同样,目标片段中的附加点不会受到影响,也不会调用其 AdjustLocationDelegate。

片段描述中由昏暗的走廊连接的两个房间的场景就是这种情况的一个示例。 在初始阶段,两个片段(房间)都已经过扫描,但没有关于这两个片段的相对位置的信息。 因此,每个片段中内容所在的坐标系统是任意的(只要该坐标系统针对该房间中所有对象恒定)。 例如,每个房间的内容可能位于一个坐标系中,而坐标系的原点位于房间的西南角。 同一片段中两个对象的坐标指示两个对象相对于彼此的位置,但两个不同片段中两个对象的坐标不能说明其相对位置。

获取更多信息后,有机会调整第二个片段中内容的坐标,以使其内容的坐标相对于第一个片段中的对象有意义。 例如,可以打开走廊的灯从而连接走廊,以填补两个片段之间的间隙。 如果将两个房间内所有内容的坐标调整到同一个坐标空间,则两个片段之间不再有任何实质区别,因此可以将它们的对象视作属于同一片段。

这种将多个片段叠为单一片段的操作称为合并操作

这里需要注意的是,对于放置在世界锁定空间场景中的普通 Unity 对象,合并操作将不起作用。 使用调整操作移动物体仅通过附加点发生。

再冻结操作

另一种情况是,定位点的位置会随着时间的推移优化。 显而易见,旋转/偏移转换已不足以弥补初始粗略定位点位置与现实世界中最近改进的位置之间的差异。 请记住,定位点本身在海绵状空间中,相对于彼此在不断地移动。 但是,从这些定位点派生的附加点在世界锁定空间中是固定的。

如果系统认识到,其管理的附加点可以通过更新定位点位置,更好地与物理世界对齐,则系统还有另一个更正事件的机会。 调整附加点位置以反映新的传感器数据,这种操作称为再冻结操作。 在合并操作中,片段中的所有对象都通过单个转换进行调整,以将两个片段的坐标空间合并到单个统一空间中,而再冻结操作则根据影响它的定位点的更新位置,单独调整每个附加点。

与合并操作一样,每个附加点通过其 AdjustLocationDelegate 了解其计算的调整转换。

如果条件合适,再冻结操作也可执行合并操作。 该合并将看作是再冻结的隐式操作:不会因合并生成单独的事件,再冻结操作中执行的调整转换将包括由于定位点移动所产生的单独调整,以及由于合并而产生的片段调整。

响应调整事件

无论是合并还是再冻结操作,对调整事件的回应取决于应用程序。 更准确地说,是取决于每个附加点处理程序,因为不同的对象类型可能有不同的反应。 通常,受附加点影响的对象将通过调整转换(通过其 GameObject.transform)进行移动。 移动可能由其他一些机制来实现,例如手动移动顶点。 对于某些应用程序来说,放弃受合并影响的对象并开始新的创建周期可能会是更有利的选择。

关键是 World Locking Tools 不依赖于应用程序如何或是否对调整操作做出反应。 这完全取决于应用程序开发人员的需求。

通知和反应调整操作的首选机制是附加点。 文章中讨论了更多详细信息和选项。

另请参阅