ARKit removes a node when Reference Image disappeared(ARKit在参考图像消失时移除节点)
问题描述
我正在构建AR Scanner应用程序,用户可以在其中扫描不同的图像并因此获得奖励。
当他们将摄像头对准某个特定图像时-我将SCNNode
放在该图像的顶部,并在他们从该图像移除摄像头后-SCNNode
GET被解雇。
但当图像消失且摄像机保持在同一位置时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中跟踪周围环境,并获取
ARImageAnchor
、ARObjectAnchor
或AREnvironmentProbeAnchor
。如果您看不到参考图像-没有ARImageAnchor,但当您再次看到它时,ARImageAnchor仍然在那里。所以没有重置。
结论:
ARWorldTrackingConfiguration
的计算成本要高得多。但是,此配置不仅允许您执行图像跟踪,还允许您执行检测到的平面的命中测试和光线投射、目标检测以及世界地图的恢复。
这篇关于ARKit在参考图像消失时移除节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:ARKit在参考图像消失时移除节点
- Android viewpager检测滑动超出范围 2022-01-01
- Android - 拆分 Drawable 2022-01-01
- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- 想使用ViewPager,无法识别android.support.*? 2022-01-01
- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01
- 用 Swift 实现 UITextFieldDelegate 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
- android 4中的android RadioButton问题 2022-01-01
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01