Есть ли способ идентифицировать затронутый узел в ARKit? - PullRequest
1 голос
/ 31 мая 2019

Я использую ARKit для проецирования 3D-файла. В этом 3D есть несколько подузлов. Когда пользователь касается какого-либо узла, мы должны отобразить некоторую информацию о затронутом узле.

Есть ли способ определить, к какому узлу обратился пользователь?

1 Ответ

2 голосов
/ 31 мая 2019

Вы можете выполнить тест на попадание , чтобы определить, к какому узлу обратился пользователь. Предполагая, что у вас есть два узла в вашей сцене, например:

override func viewDidLoad() {
    ...

    let scene = SCNScene()

    let node1 = SCNNode()
    node1.name = "node1"
    let node2 = SCNNode()
    node2.name = "node2"

    scene.rootNode.addChildNode(node1)
    scene.rootNode.addChildNode(node2)

    sceneView.scene = scene

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped))
    sceneView.addGestureRecognizer(tapGestureRecognizer)
}

В вашем обработчике касаний вы можете обнаружить затронутый узел и выполнить любую логику, например, отображать некоторую информацию об узле.

@objc func tapped(recognizer: UIGestureRecognizer) {
    guard let sceneView = recognizer.view as? SCNView else { return }
    let touchLocation = recognizer.location(in: sceneView)

    let results = sceneView.hitTest(touchLocation, options: [:])

    if results.count == 1 {
        let node = results[0].node
        print(node.name) // prints "node1" or "node2" if user touched either of them
        if node.name == "node1" {
            // display node1 information
        } else if node.name == "node2" {
            // display node2 information
        }
    }
}
...