Swift 为ARFaceTrackingConfiguration打开遮挡

Swift 为ARFaceTrackingConfiguration打开遮挡,swift,arkit,Swift,Arkit,我正试图按照以下步骤创建此文件(文章中的下图): 它基本上是识别一张脸,在脸上放点东西(纹身),然后在后面放一个背景图像 我正在使用iPhone X设备测试代码,但每次我测试.personSegmentation是否受支持时,它都是错误的: if ARFaceTrackingConfiguration.supportsFrameSemantics(.personSegmentation) { configuration.frameSemantics.insert(.personSegme

我正试图按照以下步骤创建此文件(文章中的下图):

它基本上是识别一张脸,在脸上放点东西(纹身),然后在后面放一个背景图像

我正在使用iPhone X设备测试代码,但每次我测试
.personSegmentation
是否受支持时,它都是错误的:

if ARFaceTrackingConfiguration.supportsFrameSemantics(.personSegmentation) {
    configuration.frameSemantics.insert(.personSegmentation) // code never executed.
}
我将平面添加到人脸顶部加上背景的全部代码是:

添加节点的
ARSCNViewDelegate
委托:

private var virtualBackgroundNode = SCNNode()
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    guard let device = sceneView.device else {
        return nil        
    }

    let faceGeometry = ARSCNFaceGeometry(device: device)
    let faceNode = SCNNode(geometry: faceGeometry)
    faceNode.geometry?.firstMaterial?.transparency = 0

    let tattooPlane = SCNPlane(width: 0.13, height: 0.06)
    tattooPlane.firstMaterial?.diffuse.contents = UIImage(named: "Tattoos/tattoo0")!
    tattooPlane.firstMaterial?.isDoubleSided = true

    let tattooNode = SCNNode()
    tattooNode.position.z = faceNode.boundingBox.max.z * 3 / 4
    tattooNode.position.y = 0.027
    tattooNode.geometry = tattooPlane

    faceNode.addChildNode(tattooNode)
    configureBackgroundView()
    sceneView.scene.rootNode.addChildNode(virtualBackgroundNode)

    return faceNode
}
调整背景图像的大小、设置背景图像并定位背景节点:

func configureBackgroundView() {
    let (skScene, mediaAspectRatio) = makeImageBackgroundScene(image: UIImage(named: "Cats/cat0")!)
    let size = skScene.size
    virtualBackgroundNode.geometry = SCNGeometry.Plane(width: size.width, height: size.height)
    let material = SCNMaterial()
    material.diffuse.contents = skScene
    virtualBackgroundNode.geometry?.materials = [material]
    virtualBackgroundNode.scale = SCNVector3(1.7  * mediaAspectRatio, 1.7, 1)
    let cameraPosition = sceneView.pointOfView?.scale
    let position = SCNVector3(cameraPosition!.x, cameraPosition!.y, cameraPosition!.z - 1000)
    virtualBackgroundNode.position = position   
}
此方法通过调整原始资源的大小来创建SpriteKit图像:

func makeImageBackgroundScene(image: UIImage) -> (scene: SKScene, mediaAspectRatio: Double) {
    //Adjusted so that the aspect ratio of the image is not distorted
    let width = image.size.width
    let height = image.size.height
    let mediaAspectRatio = Double(width / height)
    let cgImage = image.cgImage!
    let newImage = UIImage(cgImage: cgImage, scale: 1.0, orientation: .up)

    let skScene = SKScene(size: CGSize(width: 1000  * mediaAspectRatio, height: 1000))
    let texture = SKTexture(image: newImage)
    let skNode = SKSpriteNode(texture:texture)
    skNode.position = CGPoint(x: skScene.size.width / 2.0, y: skScene.size.height / 2.0)
    skNode.size = skScene.size
    skNode.yScale = -1.0
    skScene.addChild(skNode)

    return (skScene, mediaAspectRatio)
}
有什么建议吗?Snapchat和TikTok具有类似的人脸识别+背景设置,它们在我的设备中工作


谢谢你的帮助。

你能做到吗?事实上,我也需要同样的东西来实现,如果你找到了任何解决方案,请分享,它会有帮助的