ARKit在参考图像消失时移除节点

ARKit removes a node when Reference Image disappeared(ARKit在参考图像消失时移除节点)
本文介绍了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在参考图像消失时移除节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Why local notification is not firing for UNCalendarNotificationTrigger(为什么没有为UNCalendarNotificationTrigger触发本地通知)
iOS VoiceOver functionality changes with Bundle Identifier(IOS画外音功能随捆绑包标识符而变化)
tabbar middle tab out of tabbar corner(选项卡栏中间的选项卡角外)
Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
Dropbox Files.download does not start when number of files in folder is gt; 1000(当文件夹中的文件数为1000时,Dropbox Files.Download不会启动)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)