使用锚点

使用锚点可以让虚拟物体在 AR 场景中看起来不动。

为什么要使用锚点?

随着 ARCore 的环境理解在整个 AR 体验中不断更新,虚拟对象看起来可能会偏离放置位置。这会影响应用真实感和用户体验。

锚点可以确保对象在空间中看起来保持相同的位置和方向,从而帮助您保持虚拟对象放置在现实世界中的幻觉。

锚点的工作原理

如果您刚开始使用锚点,查看世界空间和姿势会很有帮助。

  • 世界空间

    • 用于放置镜头和对象的坐标空间
    • 在现实世界空间中,镜头和对象的位置会在帧与帧之间更新
  • 姿势

    • 表示对象在世界空间中的位置和方向
    • 在 iOS 中也称为“转换”

创建锚点时,您可以使用一种姿势来描述相对于当前帧的世界空间估算值的位置和方向。

您可以将一个或多个物体连接到此锚点。锚点和连接到锚点的物体看起来会待在它们在现实世界中的放置位置。当锚点姿态在每个帧中适应世界空间更新时,锚点会相应地更新对象的姿态。

您可以将多个对象附加到同一个锚点,以确保这些对象保持它们的相对位置和方向,即使在锚点姿态调整的情况下也是如此。

在场景中使用锚点

如需在您的场景中使用锚点,您的代码应该:

  • 在可跟踪对象(例如平面)或 ARCore 会话的上下文中创建锚点。
  • 将一个或多个物体连接到锚点。

锚点可以在场景的对象中支持不同类型的位置行为。

确定锚点上下文和场景对象所需的锚点数量取决于 AR 场景所需的位置行为。如需了解详情,请参阅以下部分。

选择锚点上下文

使用可跟踪对象或 ARCore 会话将锚点添加到您的场景。

如果您希望对象 将锚点连接到
与可跟踪对象保持“焊接”状态,并具有与可跟踪对象相同的旋转效果。
这包括:
  • 看起来粘在平面表面
  • 保持相对于可跟踪对象的位置,例如漂浮在可跟踪对象上方或前方
可跟踪
在整个用户体验过程中,似乎在现实世界空间中保持相同的姿势 ARCore 会话

锚定一个或多个物体

您可以将一个或多个对象附加到锚点。一般来说,这些对象与以下一项或多项存在空间关系:

  • 彼此
  • 可跟踪对象,例如平面
  • 在世界空间中的位置

锚点准则

有效且高效地使用锚点可以提升应用的真实感和性能。

连接到附近锚点的物体会在整个 AR 体验期间看起来逼真地保持它们的位置和彼此之间的相对位置。

仅使用您需要的锚点有助于降低 CPU 开销。

尽可能重复使用锚点

在大多数情况下,您应该对多个附近的对象使用相同的锚点,而不是为每个对象创建新的锚点。

如果对象需要保持与现实世界空间中的可跟踪对象或位置具有独特的空间关系,请为该对象使用新锚点。

请注意,如果场景中的每个对象都有自己的锚点,则这些锚点将独立调整对象姿势,以响应 ARCore 对每一帧中的世界空间的估计。单独锚定的对象可以相对于彼此移动或旋转,从而打破虚拟对象彼此相对位置应保持不变的 AR 场景的错觉。

示例
例如,假设您的应用允许用户在房间周围放置虚拟家具。当用户打开该应用时,ARCore 会以平面形式开始跟踪房间中的桌面和地板。用户在桌面上放置一台虚拟灯。然后将一把虚拟椅子放在地板上。

此时,您的场景应将一个锚点连接到桌面平面,将另一个锚点连接到地板平面。

如果用户将另一个虚拟灯添加到桌面,您可以重复使用已连接到桌面平面的锚点。这样,两个台灯看起来都粘在桌面平面上,并保持它们之间的相对位置。椅子还会保持其相对于地板平面的位置。

确保对象靠近锚点

锚定对象时,请确保它们靠近您正在使用的锚点。避免将物体放置在离锚点八米(8 米)或二十六英尺(26 英尺)远的地方,以防止由于 ARCore 对世界空间坐标的更新而导致意外的旋转移动。

如果您需要将某个对象放置在距离现有锚点 8 米以上的位置,请创建一个更靠近此位置的新锚点,并将对象附加到新锚点。

分离未使用的锚点

请分离您不再需要的任何锚点,以便提升应用性能。

对于每个可跟踪对象,您的应用都会产生 CPU 开销,ARCore 无法发布具有连接锚点的可跟踪对象。

锚点类型

锚点类型因其有效范围(从本地到全球)而有所不同。

  • 本地锚点将随应用一起存储在本地,并且仅对该应用的实例有效。用户必须位于他们放置锚点的位置。

  • 云锚点存储在 Google Cloud 中,可以在应用实例之间共享。用户必须位于他们放置锚点的位置。

  • 地理空间锚点基于大地纬度、经度和海拔,以及 Google 的视觉定位系统 (VPS) 数据,可用于几乎世界上任何地方的精确位置。只要应用已连接到互联网并且能够使用 VPS,用户就可以从远程位置放置锚点。