我正在玩 ARKit 和图像检测。现在,我有一个可检测图像的应用程序,可将屏幕上的平面放置在检测到的对象所在的位置。
如何在飞机上添加可点击元素,例如按钮。我想对每个检测到的对象都有一个 click 事件。
这是我的渲染器函数的外观:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
let referenceImage = imageAnchor.referenceImage
updateQueue.async {
let plane = SCNPlane(width: referenceImage.physicalSize.width,
height: referenceImage.physicalSize.height)
let planeNode = SCNNode(geometry: plane)
planeNode.opacity = 0.25
planeNode.eulerAngles.x = -.pi / 2
planeNode.runAction(self.imageHighlightAction)
node.addChildNode(planeNode)
}
DispatchQueue.main.async {
let imageName = referenceImage.name ?? ""
self.statusViewController.cancelAllScheduledMessages()
// self.statusViewController.showMessage("Detected image "\(imageName)"")
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let second = storyboard.instantiateViewController(withIdentifier: "InfoViewController")as! InfoViewController
second.myStringValue = imageName
// self.navigationController?.pushViewController(second, animated: true)
}
}
1 回答
有几种方法可以解决此问题:
1:标准方法:
在您的
delegate
方法中,按以下方式为每个节点分配一个名称(显然,如果您有很多节点,您可以根据需要将它们存储在数组或字典中):然后使用
touchesBegan
,执行一次 hitTest 并相应地处理触摸:2:有趣的方法:
实际上可以将
UIKit
个元素添加为SCNGeometry's Material
。我个人没有见过很多人使用这种方法,但是对于想将UIKit
和ARKit
合并的人来说,它可能很有用。创建一个自定义 UIButton e.g:
然后在您的委托方法中执行以下操作:
这应该让您开始...