我将 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 被过滤,但屏幕上的 UI 元素延迟太多,这是一个问题。
无论如何我可以使用 ARFrame 吗capturedImage
并让它识别 ARSCNView 上的 SCNNode 吗?
这是不可能使用的capturedImage
ARFrame 的。 ARKit 本身并不知道您正在使用 SceneKit 来渲染 3D 内容,因此capturedImage
仅包含相机图像本身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)