ARFoundation之路-点云与参考点

版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。

  AR 是对现实环境的增强,运动跟踪可以解决用户在现实环境中自己在哪里的问题,但运动跟踪本身并不能解决用户周边环境是什么的问题,运动跟踪不能识别出平面,也不能识别出物体,但 AR 应用必须要能理 解其本身所处的环境,这样才能为用户带来沉浸感和真实感,特别是如果要多人共享同一个体验,那 AR 应用必须要能识别和融合多用户环境。

(一)点云

  特征点是指 ARFoundation 通过 VIO 检测捕获的摄像头图像中的视觉差异点,这些视觉差异点是从图像中明暗、颜色、灰度差异比较大的点中挑选出来的,ARFoundation 会实时更新这些特征点。在时间的推移中, 一部分特征点会被删除,同时也会不断的加入新的特征点,通过算法能获取到比较稳定的特征点,这些稳定的特征点在机器视觉中就可以被解析成特定的位置信息,通过特征点随时间的变化即可计算出其位置变 化情况。检测到的特征点信息与设备 IMU 的惯性测量结果结合,不仅可以跟踪到用户(手机设备)随着 时间推移而相对于周围世界的姿态。不仅如此,ARFoundation 也通过特征点来检测平面的,在前节平面管理文章里,AR Plane组件有个属性 Vertex Changed Threshold,这个属性设置就是用来判断特征点是否属于同一平面的阀值。在下图中,花瓶周边的小点即为特征点。

在这里插入图片描述
  众多的特征点即可构成特征点云,简称点云。点云可以在帧与帧之间发生变化,在一些平台上,只生成一个点云,而另一些平台则将其特征点组织到不同空间区域的不同点云中。

  在ARFoundation中,通常认为单个特征点是不可被跟踪的,而点云则是可跟踪的,但是,特征点可以在帧与帧之间被识别,因为它们具有唯一的标识符。

  每一个特征点都有Vector3类型的位置信息(positions)以及ulong类型的id(identifiers)和float类型的置信值(confidence Value)。特征点的位置信息是在Session空间中的坐标值,可以通过ARPointCloud.position来获取。每一个特征点都有一个独一无二的id标识符,可以通过ARPointCloud.identifiers来获取,其在Unity中的类型为ulong,但具体在各平台的类型与平台相磁。置信值表示ARFoundation对每个特征点的信心程度,范围为(0,1),值越大表示对这个特征点越确信。

  与平面类似,点云由ARPointCloudManager组件负责管理,该组件负责点云的创建,特征点的创建、更新、移除,特征点的检测启用关闭、特征的显示隐藏与平面处理方式完全一致。点云数据可以辅助平面检测,更重要的是点云数据是环境重建的基础。随着时间的延长,点云数据中的特征点会迅速增长,为了防止特征点过多而影响性能,点云中的总特征点必须要控制在一定的数值范围内,ARCore将特征点的最大数限制在61440个。

  新建一个工程,在Hierarchy窗口空白处点击鼠标右键,依次选择XR->AR Default Point Cloud新建一个点云对象,如下图所示。
在这里插入图片描述
  将AR Default Point Cloud对象从Hierarchy窗口中拖动到Project窗口中的Prefabs文件夹下制作成一个Prefab,在Hierarchy中选择AR Session Origin对象,然后在其Inspector窗口中为其添加AR Point Cloud Manager组件,并将刚才制作好的AR Default Point Cloud预制体赋给AR Point Cloud Manager组件下的Point Cloud Prefab属性,最后删除Hierarchy窗口中的AR Default Point Cloud对象,如下图所示 。
在这里插入图片描述
  编译运行,效果如下图所示。
在这里插入图片描述

(二)参考点

  ARFoundation中的参考点(Reference Point)与ARCore中的Anchor其实是同一概念,锚点的原意是指不让船舶飘移的固定锚,这里用来指将虚拟物体固定在 AR 空间上的一种技 术。由于跟踪使用的陀螺仪传感器的特性,误差会随着时间积累,所以需要通过图像检测等来对误差进行 修正,此时,如果已存在于空间上的对象不同步进行校正则会出现偏差,锚点的功能即是绑定虚拟物体与 AR 空间位置。被赋予 Anchor 的对象将被视为固定在空间上的特定位置,并自动进行位置校正,锚点可以 确保物体在空间中看起来保持相同的位置和方向,让虚拟物体在 AR 场景中看起来待在原地不动。

  参考点的工作原理如下:AR 应用中,摄像头和虚拟物体在现实世界空间中的位置会在帧与帧之间更新,即虚拟物体在现实世界 空间中的姿态每帧都会更新,由于陀螺仪传感器的误差积累,虚拟物体会出现飘移现象,为解决这个问题, 我们需要使用一个参考点将虚拟对象固定在现实空间中,如前所述,这个参考点姿态信息的偏差必须要能用某种方式消除以确保参考点的姿态不会随着时间而发生变化。消除这个偏差的就是视觉校准技术,通过视觉校 准能让参考点保持相同的位置与方向,这样,连接到该参考点的虚拟对象也就不会出现飘移。一个参考点上可以 连接一个或多个虚拟对象,参考点和连接到它上面的物体看起来会待在它们在现实世界中的放置位置,随着参考点姿态在每帧中进行调整以适应现实世界空间更新,参考点也将相应地更新物体的姿态,确保这些物体能 够保持它们的相对位置和方向,即使在参考点姿态调整的情况下也能如此,有了参考点,连接到参考点上的虚拟 对象就像是固定在现实世界空间中一样。

  参考点的是一种对资源消耗比较大的可跟踪对象,因此需要谨慎使用并在不需要的时候分离参考点。

  在前文例子中,我们在平面上放置虚拟对象并没有使用参考点,也未见官方对参考点使用给出指导意见,结合我自己的经验,在以下情况下有必要使用参考点:

  • 保持两个或多个虚拟对象的相对位置。在这种情况下,我们可以将两个或多个虚拟物体挂载在同一个参考点下,这样,参考点会使用相同的矩阵更新挂载在其下的虚拟对象,因此可以保持它们之间的位置关系不受其他因素影响。
  • 保证虚拟物体的独立性。在前文中,我们在平面上放置了虚拟物体,在放置虚拟物体时我们使用的是射线检测的方式将虚拟物体挂在了平面上,通常情况下这没有问题,但如果后来因为某种原因AR Plane Manager被禁用、平面被销毁或者被隐藏,那就会影响到以平面为参考的虚拟物体位置的稳定性,导致虚拟物体漂移。在这种情况下,如果我们使用了参考点,将虚拟物体挂载在参考点下就能保持虚拟物体的独立性,不会受到平面状态的影响。
  • 提高跟踪稳定性。使用参考点即是通知跟踪系统需要独立跟踪该点从而提高挂载在该参考点上虚拟物体的稳定性。
  • 保持跟踪对象与平面的相对位置稳定。使用AttachReferencePoint()方法可以将一个参考点与平面绑定起来,从而保持挂载在参考点下的虚拟物体与平面保持关系一致。如在一个垂直平面上使用AttachReferencePoint()方法建立一个参考点,在参考点更新时就会锁定x,z分量值,从而保持参考点与平面位置关系始终一致。

  在ARFoundation中,AR Reference Point Manager提供了如下方法管理参考点:

方法 描述
AddReferencePoint(Pose) 用给定的Pose添加一个参考点,Pose为世界空间中的姿态,返回一个新的ARReferencePoint。
AttachReferencePoint(ARPlane, Pose) 用给定的Pose创建一个相对于已检测到平面的ARReferencePoint,其中ARPlane是一个已检测到的平面,Pose为世界空间中的姿态。
RemoveReferencePoint(ARReferencePoint) 移除一个ARReferencePoint,如果移除成功则返回True,如果返回False通常意味着这个ARReferencePoint已经不在跟踪状态。
referencePointsChanged 在ARReferencePoint发生变化是触发的事件,如一个新的ARReferencePoint创建、对一个现存的ARReferencePoint进行更新、移除一个ARReferencePoint。

  AddReferencePoint(Pose)方法与AttachReferencePoint(ARPlane, Pose)方法的区别在于,AddReferencePoint(Pose)是创建一个参考点,并要求跟踪系统跟踪空间中的这个特定位置,如果Session发生变化时它可能会更新;AttachReferencePoint(ARPlane, Pose)方法是将一个参考点“附加”到一个平面上时,该参考点会保持与平面的相对距离。例如,如果平面是水平的,则参考点仅在平面的Y位置更改时上下移动,其他情况下Y值不应发生变化,这对于在平面上或平面附近“粘贴”虚拟对象很有用。

  在添加ARReferencePoint时需要注意的是,添加一个ARReferencePoint需要一到两帧的时间,在添加后ARReferencePoint到添加成功之前,添加的ARReferencePoint处于“pending”状态,这个“pending”状态值可以通过ARReferencePoint.pending属性进行查询。同样的,移除一个ARReferencePoint也需要一到两帧的时间,如果尝试去移除一个还没有添加成功的ARReferencePoint,不会有任何效果。同时,一定不要手动使用Destroy()方法去销毁ARReferencePoint,这可能会引发错误,如前所述,ARReferencePoint也由ARReferencePointManager负责管理,所以务必要使用RemoveReferencePoint(ARReferencePoint)方法去移除ARReferencePoint。

  使用参考点的注意事项:
  1、尽可能复用参考点。在大多数情况下,应当让多个相互靠近的物体使用同一个参考点,而不是为每个物 体创建一个新参考点。如果物体需要保持与现实世界空间中的某个可跟踪对象或位置之间独特的空间关系, 则需要为对象创建新参考点。因为参考点将独立调整姿态以响应 ARFoundation 在每一帧中对现实世界空间的估算,如 果场景中的每个物体都有自己的参考点,则会带来很大的性能开销。另外,独立锚定的虚拟对象可以相对彼 此平移或旋转,从而破坏虚拟物体的相对位置应保持不变的 AR 场景体验。
  例如,假设 AR 应用可以让用户在房间内布置虚拟家具。当用户打开应用时,ARFoundation 会以平面形式开 始跟踪房间中的桌面和地板。用户在桌面上放置一盏虚拟台灯,然后在地板上放置一把虚拟椅子,在此情 况下,应将一个参考点连接到桌面平面,将另一个参考点连接到地板平面。如果用户向桌面添加另一盏虚拟台 灯,此时我们可以重用已经连接到桌面平面的参考点。这样,两个台灯看起来都粘在桌面平面上,并保持它 们之间的相对位置,椅子也会保持它相对于地板平面的位置。

   2、保持物体靠近参考点。锚定物体时,最好让需要连接的虚拟对象尽量靠近参考点,避免将物体放置在离 参考点几米远的地方,以免由于ARFoundation 更新现实世界空间坐标而产生意外的旋转运动。如果确实需要将物体 放置在离现有参考点几米远的地方,应该创建一个更靠近此位置的新参考点,并将物体连接到新参考点。

  3、分离未使用的参考点。为提升应用的性能,通常需要将不再使用的参考点分离。因为对于每个可跟踪对 象都会产生一定的 CPU 开销,ARFoundation 不会释放具有连接参考点的可跟踪对象,从而造成无谓的性能损失。

发布了89 篇原创文章 · 获赞 104 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/96431356
今日推荐