ARAnchor到底是什么?

Don*_*Lee 4 augmented-reality ios swift arkit realitykit

我正在尝试了解和使用ARKit。但是有一件事我无法完全理解。

苹果关于ARAnchor说:

现实世界中的位置和方向,可用于在AR场景中放置对象。

但这还不够。所以我的问题是:

  • 到底是ARAnchor什么?
  • 锚点和特征点之间有什么区别?
  • ARAnchor的特征点只是一部分?
  • 以及ARKit如何确定其锚点?

ARG*_*Geo 7

只是说 ARAnchor是一个看不见的空对象,可以在世界空间中保存3D内容(在锚点位置)。可以将ARAnchor其视为3D对象的局部轴。每个3D对象都有一个枢轴点,对不对?因此,此枢轴点必须满足ARAnchor

Apple文档所述

ARAnchor是现实世界中的位置和方向,可用于在AR Scene中放置对象。在会话中添加锚点有助于ARKit优化该锚点周围区域的世界跟踪准确性,从而使虚拟对象看起来相对于真实世界保持原位。如果虚拟对象移动,请从旧位置移除相应的锚,然后在新位置添加一个。

ARAnchor是ARKit框架中存在的所有其他类型锚的父类,因此所有这些子类均继承自ARAnchor该类。

这是带有平面锚的可视表示的图像。但请记住:默认情况下,您看不到检测到的飞机或其ARPlaneAnchor。

在此处输入图片说明

在ARKit 3.0中,您可以ARAnchors使用不同的场景添加到场景中

  • ARPlaneAnchor

    • 如果水平或/和垂直planeDetection实例属性为ON,则ARKit可以将ARPlaneAnchors添加到会话中。
  • ARImageAnchor

    • 这种锚点包含有关在AR世界跟踪会话中检测到的图像(锚点位于图像中心)的位置和方向的信息。对于激活,请使用detectionImages实例属性。在ARKit 2.0中,您最多可以跟踪多达25张图像,在ARKit 3.0中,分别最多可以跟踪100张图像。但是,在两种情况下,最多只能同时显示4张图像。
  • ARBodyAnchor

    • 在最新版本的ARKit中,您可以通过运行会话来启用身体跟踪ARBodyTrackingConfiguration()。您将在Root Joint3D Skeleton中获得ARBodyAnchor 。
  • ARFace锚

    • Face Anchor存储有关拓扑和姿势的信息以及您可以使用前置TrueDepth摄像机检测到的面部表情。当检测到脸部时,“脸部固定点”将附加在鼻子后面的脸部中央。在ARKit 2.0中,您只能跟踪一张脸,而在ARKit 3.0中,最多可以同时跟踪3张脸。
  • ARObjectAnchor

    • 这种类型的锚点保存有关在世界跟踪会话中检测到的真实3D对象的6个自由度(位置和方向)的信息。
  • AREnvironmentProbeAnchor

    • Probe Anchor在世界跟踪会议中为特定空间区域提供环境照明信息。ARKit的人工智能使用它为金属着色器提供环境反射。
  • ARParticipantAnchor

    • 对于多用户AR体验而言,这是必不可少的锚类型。如果要使用它,请trueisCollaborationEnabled实例属性和Multipeer Connectivity框架使用值。

还有其他常规方法可以在AR会话中创建锚点

  • 命中测试法

    • 在屏幕上点击,将一个点投影到一个隐藏的检测平面上,将ARAnchor放置在虚拟射线与该平面相交的位置。
  • 射线投射法

    • 轻击屏幕,还将点投影到隐藏的检测平面上。射线投射与命中测试的主要区别在于,在使用后者的ARKit时,由于它会更多地了解检测到的表面,因此会不断完善射线投射。
  • 特征点

    • ARKit在现实对象的高对比度边缘上自动生成的特殊黄点,可以为您提供放置ARAnchor的位置。由于采用了命中测试方法,因此这种方法也是可行的。
  • ARCamera的转型

    • iPhone相机的位置和方向(矩阵4x4)可以轻松用作ARAnchor的位置。
  • 任何世界立场

    • 将ARAnchor放置在所需场景中的任何位置。

下面是代码片段,如何在renderer方法内实现锚点:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
    let grid = Grid(anchor: planeAnchor)
    node.addChildNode(grid)
}
Run Code Online (Sandbox Code Playgroud)

自2019年RealityKit发布以来,您可以使用其新类AnchorEntity。使用AnchorEntity类作为实体层次结构的根点,并将其添加到Scene实例的anchors集合中。这使ARKit可以将锚实体及其所有层次后代放置到现实世界中。

AnchorEntity 内部存储三个组件:

为了找出两者之间的区别ARAnchorAnchorEntity请看这篇文章

  • @rajapateriya,您好,请将其作为 SO 问题发布。PS我把所有这些东西都记在脑子里))。目前优秀的学习资源并不多。那是因为 ARKit 还太年轻。顺便,尝试阅读“raywenderlich”的 ARKit 书。 (3认同)

归档时间:

查看次数:

949 次

最近记录:

6 年,2 月 前