ARKit и Vision — как разместить SCNPlane на найденном QR-коде?

Через Vision Framework я могу обнаружить QR-код. Следующее, что я хотел бы сделать, это разместить SCNPlane точно на QRCode, используя ARKit. Я написал код ниже, чтобы найти положение QRCode в реальном мире. Но SCNPlane продолжает добавляться не в то место. Переменная штрих-кода в приведенном ниже коде имеет тип VNBarcodeObservation.

Может быть, кто-то из вас, ребята, знает, что я делаю неправильно.

let rect = CGPoint(x: barcode.boundingBox.origin.x, y: barcode.boundingBox.origin.y)
let hitTestResults = sceneView.hitTest(rect, types: [.existingPlaneUsingExtent, .existingPlane])
if let hitResult = hitTestResults.first {

    //TODO: change to width and height
    let plane = SCNPlane(width: 0.1, height: 0.1)
    let material = SCNMaterial()
    material.diffuse.contents = UIColor.red
    plane.materials = [material]

    let node = SCNNode()        
    node.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)

    node.position = SCNVector3(hitResult.worldTransform.columns.3.x,
                                         hitResult.worldTransform.columns.3.y,
                                         hitResult.worldTransform.columns.3.z)

    node.geometry = plane  
    sceneView.scene.rootNode.addChildNode(node)
}

Редактировать:

Добавил фото текущей ситуации. Красная плоскость добавлена ​​в верхнем левом углу. Однако эта плоскость должна быть добавлена ​​именно в QRCode.

введите здесь описание изображения


person KNV    schedule 02.11.2017    source источник
comment
Привет, я также пытаюсь реализовать сканирование QR-кода с помощью Vision и показать какой-либо объект с помощью ARKit поверх QR-кода. Не могли бы вы поделиться более подробной информацией о том, как вы это сделали?   -  person Mithun    schedule 27.02.2019
comment
Привет @Mithun, пожалуйста, проверьте: github.com/Koen6095/ARKit   -  person KNV    schedule 04.03.2019


Ответы (1)


У меня работает с использованием центральной точки вместо начала:

let center2 = CGPoint(x: result.boundingBox.midX, y: result.boundingBox.midY)

let hitTestResults2 = frame.hitTest(center2, types: [.featurePoint/*, .estimatedHorizontalPlane, .existingPlane, .existingPlaneUsingExtent*/] )
person meow    schedule 11.11.2017
comment
Это не работает для меня. - person Saad Rehman; 04.04.2021