[РЕШЕНО] Touch on model (ARKit)


#1

Всем привет.
Столкнулся с проблемой в ARKit
Имеется модель *.usdz
вот её иерархия
41

есть функция касания

@objc func touchOnModel(_ recognizer: UIGestureRecognizer) {
   let touchLocation = recognizer.location(in: sceneView)
    guard let node = sceneView.hitTest(touchLocation, options: [:]).first?.node else { return}
    print(node.name!) // FlowerPlant_01___Default_0
}

Как можно получить корень каталога (print(node.name!) // scene), а не дочерний объект?


#2

Перед добавление модели на сцену я меняю имя корневого каталога на

let name = UUID().uuidString
    referenceNode.name = name // 99F52663-6378-4AC7-899F-D6178499BE7A

Теперь для поиска использую вспомогательную функцию

func getRoot(for node: SCNNode) -> SCNNode? {
    if let _node = node.parent {
        if _node.name != nil {
        if UUID(uuidString: _node.name!) != nil {
            return _node
            }
        } else {
            return getRoot(for: _node)
        }
        return getRoot(for: _node)
    }
    else {
        return nil
    }
}

Вызываем её тут

@objc func touchOnModel(_ recognizer: UIGestureRecognizer) {
   let touchLocation = recognizer.location(in: sceneView)
    let hitTestResult = sceneView.hitTest(touchLocation)
    if let result = hitTestResult.first {
        guard let rootNode = getRoot(for: result.node) else {return}
        print(rootNode.name!) // 99F52663-6378-4AC7-899F-D6178499BE7A
        .....
    }
}

#3

Немного переписал (неосознанное внутреннее влечение являлось причиной этого действа) без повторений и force unwrap. Может понадобится.

func getRoot(for node: SCNNode) -> SCNNode? {
    guard let parentNode = node.parent else { return nil }
    if let name = parentNode.name, let _ = UUID(uuidString: name) {
        return parentNode
    } else {
        return getRoot(for: parentNode)
    }
}

#4
Оффтоп

Тогда и второй else можно опустить)


#5

Тоже её переписал :grinning:
первый вариант был на скорую руку
Все ровно спасибо