ARKit在参考图像消失时移除节点 [英] ARKit removes a node when Reference Image disappeared

查看:25
本文介绍了ARKit在参考图像消失时移除节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建AR Scanner应用程序,用户可以在其中扫描不同的图像并因此获得奖励。

当他们将摄像头对准某个特定图像时-我将SCNNode放在该图像的顶部,并在他们从该图像移除摄像头后-SCNNodeGET被解雇。

但当图像消失且摄像机保持在同一位置时SCNNode未被解雇。

如何使其与参考图像一起消失?

我在这里研究了很多其他答案,但它们对我没有帮助

以下是添加和删除SCNNode的代码:

extension ARScannerScreenViewController: ARSCNViewDelegate {

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    DispatchQueue.main.async { self.instructionLabel.isHidden = true }
    if let imageAnchor = anchor as? ARImageAnchor {
        handleFoundImage(imageAnchor, node)
        imageAncors.append(imageAnchor)
        trackedImages.append(node)
    } else if let objectAnchor = anchor as? ARObjectAnchor {
        handleFoundObject(objectAnchor, node)
    }
}

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    guard let pointOfView = sceneView.pointOfView else { return }
    for (index, item) in trackedImages.enumerated() {
        if !(sceneView.isNode(item, insideFrustumOf: pointOfView)) {
            self.sceneView.session.remove(anchor: imageAncors[index])
        }
    }
}

private func handleFoundImage(_ imageAnchor: ARImageAnchor, _ node: SCNNode) {
    let name = imageAnchor.referenceImage.name!
    print("you found a (name) image")

    let size = imageAnchor.referenceImage.physicalSize
    if let imageNode = showImage(size: size) {
        node.addChildNode(imageNode)
        node.opacity = 1
    }
}

private func showImage(size: CGSize) -> SCNNode? {
    let image = UIImage(named: "InfoImage")
    let imageMaterial = SCNMaterial()
    imageMaterial.diffuse.contents = image

    let imagePlane = SCNPlane(width: size.width, height: size.height)
    imagePlane.materials = [imageMaterial]

    let imageNode = SCNNode(geometry: imagePlane)
    imageNode.eulerAngles.x = -.pi / 2
    return imageNode
}

private func handleFoundObject(_ objectAnchor: ARObjectAnchor, _ node: SCNNode) {
    let name = objectAnchor.referenceObject.name!
    print("You found a (name) object")
}

}

我也尝试使用ARSession使其工作,但我甚至无法获取指纹:

func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
    for anchor in anchors {
        for myAnchor in imageAncors {
            if let imageAnchor = anchor as? ARImageAnchor, imageAnchor == myAnchor {
                if !imageAnchor.isTracked {
                    print("Not tracked")
                } else {
                    print("tracked")
                }
            }
        }
    }
}

推荐答案

您必须使用ARWorldTrackingConfiguration,而不是ARImageTrackingConfiguration。在应用程序中同时使用这两种配置是非常糟糕的,因为每次在它们之间切换时,跟踪状态都会被重置,您必须从头开始跟踪。

让我们看看Apple文档是如何介绍ARImageTrackingConfiguration的:

使用ARImageTrackingConfiguration,ARKit建立3D空间不是通过跟踪设备相对于世界的运动,而是仅通过检测和跟踪摄像机所看到的已知2D图像的运动。

这两个配置之间的基本区别在于ARAnchors的行为方式

    仅当参考图像在相机视图中时,
  • ARImageTrackingConfiguration才允许您获取ARImageAnchors。因此,如果你看不到参考图像--没有ARImageAnchor,那么就没有3D模型(每次你看不到它,然后又看不到它,它就会重置)。您可以同时检测up to 100 images

  • ARWorldTrackingConfiguration允许您在6DoF中跟踪周围环境,并获取ARImageAnchorARObjectAnchorAREnvironmentProbeAnchor。如果您看不到参考图像-没有ARImageAnchor,但当您再次看到它时,ARImageAnchor仍然在那里。所以没有重置。

结论

ARWorldTrackingConfiguration的计算成本要高得多。但是,此配置不仅允许您执行图像跟踪,还允许您执行检测到的平面的命中测试和光线投射、目标检测以及世界地图的恢复。

这篇关于ARKit在参考图像消失时移除节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆