hitTest (_: options :) не распознает узлы за плоскостями ARKit - PullRequest
0 голосов
/ 30 апреля 2018

Я помещаю объект на стену, затем пытаюсь распознать нажатие на нее, но тест попадания возвращает 0 объектов. Когда я изменяю положение Z объекта и помещаю его немного ближе к кулачку, это хорошо распознается, но это не решение, потому что плоскости всегда меняются и могут в любой момент покрыть объект. Как я могу заставить HitTest работать правильно и распознавать мои узлы за плоскостями? Или, может быть, я использую неправильный метод?

fileprivate func addNode(atPoint point: CGPoint) {
    let hits = sceneView.hitTest(point, types: .existingPlaneUsingExtent)
    if hits.count > 0, let firstHit = hits.first, let originNode = originNode {
        let node = originNode.clone()
        sceneView.scene.rootNode.addChildNode(node)
        node.position = SCNVector3Make(firstHit.worldTransform.columns.3.x, firstHit.worldTransform.columns.3.y, firstHit.worldTransform.columns.3.z)
        let resize = simd_float4x4(SCNMatrix4MakeScale(0.2, 0.2, 0.2))
        let rotation = simd_float4x4(SCNMatrix4MakeRotation(.pi / 2, -1, 0, 0))
        let transform = simd_mul(firstHit.worldTransform, resize)
        let finalTransform = simd_mul(transform, rotation)
        node.simdTransform = finalTransform
        addedNodes.insert(node)
    }
}

func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else {
        print("Unable to identify touches on any plane. Ignoring interaction...")
        return
    }

    let touchPoint = touch.location(in: sceneView)

    let hits = sceneView.hitTest(touchPoint, options: [SCNHitTestOption.boundingBoxOnly: true])
    let filtered = hits.filter({ addedNodes.contains($0.node) })
    print("\(hits.count) vs \(filtered.count), \(hits.first?.node.name ?? "no name")")
    if let node = filtered.first?.node {
        node.removeFromParentNode()
        addedNodes.remove(node)
        return
    }

    addPictureToPlane(atPoint: touchPoint)
}

AddedNodes - установить с добавленными объектами. Когда я добавил трансформирующее преобразование с изменением координаты Z по крайней мере на 0,05 (близко к камере), обнаружил, что работает хорошо. По крайней мере, до смены плоскости и продвижения вперед по узлу.

1 Ответ

0 голосов
/ 01 мая 2018

Я считаю, что вам нужно изменить параметр SCNHitTestSearchMode, который позволяет вам установить:

Возможные значения для параметра searchMode, используемого при тестировании нажатия методы.

static let searchMode: SCNHitTestOption

Причем:

Значением этого ключа является объект NSNumber, содержащий необработанные целочисленное значение константы SCNHitTestSearchMode.

Из Apple Docs есть три возможных варианта, которые вы можете использовать здесь:

case all

Тест попадания должен вернуть все возможные результаты, отсортированные от ближайшего до самых дальних.

case any

Тест на попадание должен возвращать только первый найденный объект, независимо от расстояние.

case closest

Тест попадания должен возвращать только найденный объект закрытия.

Поэтому, исходя из вашего вопроса, вам, вероятно, придется использовать all case.

Таким образом, ваш hitTest function, вероятно, должен выглядеть примерно так (помня, что self.augmentedRealityView относится к ARSCNView):

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    //1. Get The Current Touch Location
    guard let currentTouchLocation = touches.first?.location(in: self.augmentedRealityView) else { return }

    //2. Perform An SCNHitTest Setting The SearchMode To 1 (All) Which Returns A List Of Results Sorted From Nearest To Farthest
    if #available(iOS 11.0, *) {

        let hitTestResults = self.augmentedRealityView.hitTest(currentTouchLocation, options: [SCNHitTestOption.searchMode: 1])

        //3. Loop Through The Results & Get The Nodes
        for index in 0..<hitTestResults.count{

            let node = hitTestResults[index]
            print(node)

        }
    }
}
...