ios - 将 SCNNode 放置在平面上并检测节点是否被点击

标签 ios swift arkit scnnode sceneview

我正在开发一个应用程序,它首先检测到有一个垂直平面,然后,如果用户触摸该平面,我会向根节点添加一个 SCNNode。在那之后,我想检测用户是否触摸节点来做更多的事情,但我无法检测到那个点击,它只检测平面点击。现在我又回到了这个方法:

    @objc func tapped(sender: UITapGestureRecognizer) {
        let sceneView = sender.view as! ARSCNView
        let tapLocation = sender.location(in: sceneView)
        let hitTest = sceneView.hitTest(tapLocation, types: .existingPlaneUsingExtent)
        if !hitTest.isEmpty {
            addItem(hitTestResult: hitTest.first!)
            hideTip()
    }
}

这是在平面上点击时添加节点的那个,但现在我想检测节点何时被点击,我使用了这段代码:

    let sceneView = sender.view as! ARSCNView
    let tapLocation = sender.location(in: sceneView)
    let hitTouchTest = sceneView.hitTest(tapLocation)
    if !hitTouchTest.isEmpty {
        let results = hitTouchTest.first!
        let node = results.node
    }

它进入 if,但节点的名称始终为 nil,当我创建节点并将其添加到平面时,我给它起了一个名称...我如何检测节点是否被点击?

最佳答案

此解决方案的问题在于您获取了被触及的节点数组的第一个值。 我建议阅读下一个主题: https://developer.apple.com/documentation/scenekit/scnhittestoption

以及您可以实现的解决方案:

func registerGestureRecognizer() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(search))
    self.sceneView.addGestureRecognizer(tap)
}

@objc func search(sender: UITapGestureRecognizer) {
    let sceneView = sender.view as! ARSCNView
    let location = sender.location(in: sceneView)
    let results = sceneView.hitTest(location, options: [SCNHitTestOption.searchMode : 1])

    guard sender.state == .began else { return }
        for result in results.filter( { $0.node.name != nil }) {
            if result.node.name == "Your node name" {
                // do manipulations
            }
        }
}

附言此方法可帮助您通过名称获取特定节点。 希望对您有所帮助!

关于ios - 将 SCNNode 放置在平面上并检测节点是否被点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52425205/

相关文章:

ios - 反转 UIView 的位置,带动画

ios - UIView.animate 不适用于背景颜色

ios - 如何在 ARkti 中检查相机向左或向右旋转

ios - 添加 Google 移动插页式广告 Swift

ios - ios在应用程序结算中。自动续订后是否需要发送新的收据?

swift - 在 Swift 中需要类似的函数 strtotime ("next monday")

ios - iOS10中ARKit的替代品

ios - 函数仅在场景 View 上放置 1 个 ARKit 对象节点(Swift 4)

ios - Swift 3 (SpriteKit) 从自定义类中将子项添加到 GameScene

ios - 无法将字符串转换为日期