SCNNode не отображается в захваченном изображении ARFrame - PullRequest
2 голосов
/ 06 апреля 2020

Я добавил 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?

1 Ответ

0 голосов
/ 16 апреля 2020

Это невозможно при использовании capturedImage ARFrame. Сам ARKit не знает, что вы используете SceneKit для рендеринга вашего 3D-контента, поэтому capturedImage будет содержать только само изображение с камеры.

...