Размещение SCNNode на плоскости и обнаружение, что узел прослушивается - PullRequest
0 голосов
/ 20 сентября 2018

Я работаю над приложением, которое сначала обнаруживает наличие вертикальной плоскости, а после этого, если пользователь касается плоскости, я добавляю SCNNode в rootNode.После этого я хочу определить, касается ли пользователь узла, чтобы выполнить больше действий, но я не могу обнаружить это касание, оно просто обнаруживает касания плоскости.Прямо сейчас я вернулся к этому методу:

    @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, и когда я создаю узел, добавляя его в плоскость, я даю ему имя ... Как я могуобнаружить, что узел прослушивается?

1 Ответ

0 голосов
/ 20 сентября 2018

Проблема с этим решением состоит в том, что вы берете первое значение массива узлов, к которому вы прикоснулись.Я рекомендую прочитать следующую тему: 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
            }
        }
}

PS Этот подход помогает вам получить конкретный узел через его имя.Надеюсь, это поможет!

...