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: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 はフィルター処理されますが、画面上の UI 要素の遅延が大きすぎて問題になります。

とにかくARFrameを使用capturedImageして、ARSCNViewにあるSCNNodeを認識させることはできますか?

4

1 に答える 1