ARKit удаляет узел при исчезновении эталонного изображения - PullRequest
1 голос
/ 04 февраля 2020

Я создаю приложение AR Scanner, где пользователи могут сканировать различные изображения и получать за это награды.

Когда они указывают камеру на какое-то конкретное c изображение - я помещаю SCNNode поверх это изображение и после того, как они удаляют камеру из этого изображения - SCNNode get отклоняется.

Но когда изображение исчезает и камера остается в том же положении, SCNNode не отклоняется.

Как я могу заставить его исчезнуть вместе с исчезновением контрольного изображения?

Я изучил множество других ответов здесь, на SO, но они не помогли мне

Вот мой код для добавления и удаления SCNNode:

extension ARScannerScreenViewController: ARSCNViewDelegate {

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    DispatchQueue.main.async { self.instructionLabel.isHidden = true }
    if let imageAnchor = anchor as? ARImageAnchor {
        handleFoundImage(imageAnchor, node)
        imageAncors.append(imageAnchor)
        trackedImages.append(node)
    } else if let objectAnchor = anchor as? ARObjectAnchor {
        handleFoundObject(objectAnchor, node)
    }
}

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    guard let pointOfView = sceneView.pointOfView else { return }
    for (index, item) in trackedImages.enumerated() {
        if !(sceneView.isNode(item, insideFrustumOf: pointOfView)) {
            self.sceneView.session.remove(anchor: imageAncors[index])
        }
    }
}

private func handleFoundImage(_ imageAnchor: ARImageAnchor, _ node: SCNNode) {
    let name = imageAnchor.referenceImage.name!
    print("you found a \(name) image")

    let size = imageAnchor.referenceImage.physicalSize
    if let imageNode = showImage(size: size) {
        node.addChildNode(imageNode)
        node.opacity = 1
    }
}

private func showImage(size: CGSize) -> SCNNode? {
    let image = UIImage(named: "InfoImage")
    let imageMaterial = SCNMaterial()
    imageMaterial.diffuse.contents = image

    let imagePlane = SCNPlane(width: size.width, height: size.height)
    imagePlane.materials = [imageMaterial]

    let imageNode = SCNNode(geometry: imagePlane)
    imageNode.eulerAngles.x = -.pi / 2
    return imageNode
}

private func handleFoundObject(_ objectAnchor: ARObjectAnchor, _ node: SCNNode) {
    let name = objectAnchor.referenceObject.name!
    print("You found a \(name) object")
}

}

Я также пытался заставить его работать, используя ARSession, но я даже не смог добраться до отпечатков:

func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
    for anchor in anchors {
        for myAnchor in imageAncors {
            if let imageAnchor = anchor as? ARImageAnchor, imageAnchor == myAnchor {
                if !imageAnchor.isTracked {
                    print("Not tracked")
                } else {
                    print("tracked")
                }
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 28 марта 2020

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

Давайте посмотрим, что в документации Apple говорится об ARImageTrackingConfiguration:

С помощью ARImageTrackingConfiguration ARKit создает трехмерное пространство не путем отслеживания движения устройства относительно мира , а исключительно путем обнаружения и отслеживания движения известных 2D-изображений в поле зрения камеры. ,

Основные c различия между этими двумя конфигами связаны с поведением ARAnchors :

  • ARImageTrackingConfiguration позволяет получить ARImageAnchors только в том случае, если ваши эталонные изображения находятся в режиме камеры. Так что, если вы не видите эталонное изображение - нет ARImageAnchor, поэтому нет 3D-модели (она сбрасывается каждый раз, когда вы не можете увидеть-потом-увидеть-потом). Помните, что вы можете одновременно обнаружить не более 4 изображений .

  • ARWorldTrackingConfiguration позволяет отслеживать окружающую среду в 6 DoF и получите ARImageAnchor, ARObjectAnchor или AREnvironmentProbeAnchor. Если вы не видите эталонное изображение - нет ARImageAnchor, но когда вы видите его снова, ARImageAnchor все еще там. Так что сброса нет.

Вывод :

ARWorldTrackingConfiguration Стоимость вычислений намного выше. Однако эта конфигурация позволяет выполнять не только отслеживание изображений, но также тестирование на попадание и приведение лучей для обнаруженных самолетов, обнаружение объектов и восстановление карт мира.

0 голосов
/ 04 февраля 2020

Используйте nodeForAnchor для загрузки ваших узлов, поэтому, когда якоря исчезнут, узлы также будут go.

...