2

我在 ARSCNView 中添加了一个 SCNNode:

 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:glassesNodeframe.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 被过滤,但屏幕上的 UI 元素延迟太高,这是一个问题。

无论如何我可以使用 ARFramecapturedImage并让它识别 ARSCNView 上的 SCNNode 吗?

4

1 回答 1

0

capturedImage使用ARFrame是不可能的。ARKit 本身并不知道您正在使用 SceneKit 来渲染 3D 内容,因此它capturedImage只会包含相机图像本身。

于 2020-04-16T13:40:41.947 回答