gpt4 book ai didi

swift - ARAnchor到底是什么?

转载 作者:可可西里 更新时间:2023-11-01 05:32:23 41 4
gpt4 key购买 nike

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

苹果关于ARAnchor说:

A real-world position and orientation that can be used for placing objects in an AR scene.



但这还不够。所以我的问题是:
  • 确切的ARAnchor是什么?
  • anchor 和特征点之间有什么区别?
  • ARAnchor是特征点的一部分吗?
  • ARKit如何确定其 anchor ?
  • 最佳答案

    更新:2021年1月23日。
    TL; DR

    anchor ARAnchor不可见的空对象,可以将3D模型保持在世界空间中 anchor 的位置。想想ARAnchor,就像它是模型的带有局部轴的transform node(您可以对其进行平移,旋转和缩放)一样。每个3D模型都有一个枢轴点,对不对?因此,此枢轴点必须满足ARAnchor
    如果您未在ARKit/RealityKit应用程序中使用 anchor ,则您的3D模型可能会偏离其放置位置,这将极大地影响您应用程序的真实感和用户体验。因此, anchor 是AR场景中的关键元素。
    根据ARKit文档2017:

    ARAnchor is a real-world position and orientation that can be used for placing objects in AR Scene. Adding an anchor to the session helps ARKit to optimize world-tracking accuracy in the area around that anchor, so that virtual objects appear to stay in place relative to the real world. If a virtual object moves, remove the corresponding anchor from the old position and add one at the new position.

    ARAnchor是ARKit框架中现有的所有其他 anchor 类型的父类,因此所有这些子类均继承自 ARAnchor类,但不能直接在您的代码中使用。我还必须说 ARAnchorFeature Points没有共同点。 Feature Points是用于成功跟踪和调试的。 ARAnchor不会自动跟踪真实目标。如果需要自动化,则必须使用 rendered(...)session(...)实例方法,如果您分别遵守协议(protocol) ARSCNViewDelegateARSessionDelegate,则可以调用这些方法。
    这是带有平面 anchor 的可视表示的图像。但请记住:默认情况下,您既看不到检测到的平面,也看不到其对应的 ARPlaneAnchor。因此,如果您想在场景中看到任何 anchor ,则必须使用三个瘦 SCNCylinder原语“可视化”它。

    enter image description here

    在ARKit中,您可以使用不同的场景自动将 ARAnchors添加到场景中:
  • ARPlaneAnchor
  • 如果水平和/或垂直 planeDetection 实例属性为ON,则ARKit可以将ARPlaneAnchors添加到当前 session 。有时启用的planeDetection会大大增加场景理解阶段所需的时间。

  • ARImageAnchor (符合 ARTrackable 协议(protocol))
  • 这种类型的定位点包含有关在世界跟踪 session 中检测到的图像(定位点位于图像中心)的位置和方向的信息。要进行激活,请使用 detectionImages 实例属性。在ARKit 2.0中,您总共可以跟踪多达25张图像,在ARKit 3.0和ARKit 4.0中,分别可以跟踪多达100张图像。但是,在两种情况下均为not more than just 4 images simultaneously

  • ARBodyAnchor (符合ARTrackable协议(protocol))
  • 在最新版本的ARKit中,您可以通过使用 ARBodyTrackingConfiguration() 运行 session 来启用 body 跟踪。您将以CG Skeleton的 Root Joint 或在跟踪角色的骨盆位置获得ARBodyAnchor。

  • ARFaceAnchor (符合ARTrackable协议(protocol))
  • Face Anchor存储有关拓 flutter 和姿势的信息,以及您可以使用前置TrueDepth相机或常规RGB相机检测到的面部表情的信息。当检测到脸部时,“脸部固定点”将附加在 Nose 后面的脸部中央。在ARKit 2.0中,您只能跟踪一张脸,而在ARKit 3.0中,最多可以同时跟踪3张脸。在ARKit 4.0中,许多被跟踪的面部取决于TrueDepth传感器和CPU:配备TrueDepth摄像头的智能手机最多可跟踪3个面孔,带有A12 +芯片组但不配备TrueDepth摄像头的智能手机也可以最多跟踪3个面孔。

  • ARObjectAnchor
  • 该 anchor 的类型保留有关在世界跟踪 session 中检测到的真实3D对象的6个自由度(位置和方向)的信息。请记住,您需要为 session 配置的ARReferenceObject属性指定detectionObjects实例。

  • AREnvironmentProbeAnchor
  • 探针 anchor 可以在世界跟踪 session 中为特定空间区域提供环境照明信息。 ARKit的人工智能使用它为反射着色器提供环境反射。

  • ARParticipantAnchor
  • 这是多用户AR体验必不可少的 anchor 类型。如果要使用它,请在true框架中将isCollaborationEnabled值用于MultipeerConnectivity实例属性。

  • ARMesh anchor
  • ARKit和LiDAR将用户周围的重建现实世界场景细分为网格 anchor 。随着ARKit增强对现实世界的了解,网格 anchor 不断更新其数据。尽管ARKit更新了网格以反射(reflect)物理环境的变化,但是网格的后续变化并非旨在实时反射(reflect)。有时,您重建的场景最多可以包含 100 anchors 甚至更多。这是由于每个分类对象都有其自己的个人 anchor 。每个ARMeshAnchor存储有关相应顶点的数据(八种分类案例之一),其面和顶点法线。

  • ARGeoAnchor (符合ARTrackable协议(protocol))
  • 在ARKit 4.0+中,有一个geo anchor(又称位置 anchor ),它使用GPS,Apple Maps和来自Apple服务器的其他环境数据来跟踪地理位置。这种定位标记可标识应用程序可以引用的世界中的特定区域。当用户在场景中四处移动时, session 会根据坐标和设备的地理 anchor 指南针方向更新位置 anchor 的变换。查看supported cities的列表。

  • ARAppClipCodeAnchor (符合ARTrackable协议(protocol))
  • 此 anchor 在ARKit 4.0+的物理环境中跟踪App Clip Code的位置和方向。您可以使用“应用程序剪辑代码”使用户能够在现实世界中发现您的应用程序剪辑。


  • There are also other regular approaches to create anchors in AR session:


  • 命中测试方法
  • 在屏幕上点击,将一个点投影到一个不可见的检测平面上,将ARAnchor放置在虚拟射线与该平面相交的位置。顺便说一句,iOS 14中将弃用ARHitTestResult类及其对ARSCNView和ARSKView的命中测试方法,因此您必须习惯射线铸造。

  • 射线铸造方法
  • 如果您使用的是ray-casting,则在屏幕上轻按会在不可见的检测平面上投影3D点。但是,您也可以在3D场景中的A和B位置之间执行射线投射。射线投射与命中测试的主要区别在于,当使用第一个ARKit时,它会在了解有关检测到的表面的更多信息时继续完善射线投射,并且射线投射可以是2D到3D和3D到3D

  • 特征点
  • ARKit在现实对象的高对比度边界上自动生成的特殊黄点,可以为您放置ARAnchor提供一个位置。

  • ARCamera的转换
  • iPhone相机的位置和方向simd_float4x4可以轻松用作ARAnchor的位置。

  • 任何任意世界位置
  • 将自定义ARWorldAnchor放置在场景中的任何位置。您可以像在RealityKit中找到的world anchor一样生成ARKit的AnchorEntity(.world(transform: mtx))版本。


  • 此代码段显示了如何在委托(delegate)人的方法中使用ARPlaneAnchor: renderer(_:didAdd:for:):
    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)
    }

    anchor 实体
    根据RealityKit文档2019:

    AnchorEntity is an anchor that tethers virtual content to a real-world object in an AR session.


    WWDC'19中发布了 RealityKit 框架和 Reality Composer 应用程序。他们有一个名为 AnchorEntity的新类。您可以将AnchorEntity用作任何实体层次结构的根点,并且必须将其添加到Scene anchors集合中。 AnchorEntity自动跟踪现实世界的目标。在RealityKit和Reality Composer中, AnchorEntity在层次结构的顶部。该 anchor 能够容纳一百个模型,在这种情况下,与为每个模型使用100个个人 anchor 相比,它更稳定。
    让我们看看它在代码中的外观:
    func makeUIView(context: Context) -> ARView {

    let arView = ARView(frame: .zero)
    let modelAnchor = try! Experience.loadModel()
    arView.scene.anchors.append(modelAnchor)
    return arView
    }
    AnchorEntity 具有三个组成部分:
  • Anchoring组件
  • Transform组件
  • Synchronization组件

  • To find out the difference between ARAnchor and AnchorEntity look at THIS POST.


    以下是RealityKit 2.0 for iOS中提供的九种AnchorEntity案例:
    // Fixed position in the AR scene
    AnchorEntity(.world(transform: mtx))

    // For body tracking (a.k.a. Motion Capture)
    AnchorEntity(.body)

    // Pinned to the tracking camera
    AnchorEntity(.camera)

    // For face tracking (Selfie Camera config)
    AnchorEntity(.face)

    // For image tracking config
    AnchorEntity(.image(group: "Group", name: "model"))

    // For object tracking config
    AnchorEntity(.object(group: "Group", name: "object"))

    // For plane detection with surface classification
    AnchorEntity(.plane([.any], classification: [.seat], minimumBounds: [1.0, 1.0]))

    // When you use ray-casting
    AnchorEntity(raycastResult: myRaycastResult) /* no dot notation */

    // When you use ARAnchor with a given identifier
    AnchorEntity(.anchor(identifier: uuid))

    // Creates anchor entity on a basis of ARAnchor
    AnchorEntity(anchor: arAnchor) /* no dot notation */
    这是RealityKit 2.0中适用于macOS的仅两种AnchorEntity案例:
    // Fixed world position in VR scene
    AnchorEntity(.world(transform: mtx))

    // Camera transform
    AnchorEntity(.camera)

    Also it’s not superfluous to say that you can use any subclass of ARAnchor for AnchorEntity needs:

    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {

    guard let faceAnchor = anchors.first as? ARFaceAnchor
    else {
    return
    }
    arView.session.add(anchor: faceAnchor)

    let anchor = AnchorEntity(anchor: faceAnchor)
    anchor.addChild(model)
    arView.scene.anchors.append(anchor)
    }

    关于swift - ARAnchor到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52893075/

    41 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com