Я добавил SCNNode в ARSCNView:
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
guard let faceAnchor = anchor as? ARFaceAnchor else { return nil }
guard let device = sceneView.device else { return nil }
guard let faceGeometry = ARSCNFaceGeometry(device: device, fillMesh: true) else { return nil }
let faceNode = FaceNode(faceGeometry)
// Node is a custom SCNNode class
let glassesNode = Node(image: UIImage(named: "glasses")!, position: .glasses, anchor: faceAnchor)
faceNode.addChildNode(glassesNode)
return faceNode
}
Затем я использую эту функцию делегата, чтобы добавить фильтр к каждому кадру. Проблема в том, что добавлен SCNNode: glassesNode
не распознается в frame.capturedImage
. Следовательно, фильтр не применяется к узлу SCNNode, но применяется ко всему остальному.
func session(_ session: ARSession, didUpdate frame: ARFrame) {
guard let image = CIImage(cvImageBuffer: frame.capturedImage)) else { return }
let filterImage = setFilter(image)
sceneView.scene.background.contents = context.createCGImage(filterImage, from: filterImage.extent)
}
Единственный обходной путь - использование свойства snapshot()
ARSCNView. Который работает хорошо. SCNNode фильтруется, но слишком большая задержка с элементами пользовательского интерфейса на экране, что является проблемой.
Есть ли в любом случае, я могу использовать ARFrame capturedImage
и он распознает SCNNode, который находится на ARSCNView?