首页 > 解决方案 > 如何将 ARKit 节点更改为不同的东西

问题描述

我需要一些帮助才能在我的ARKit场景中实现自定义节点。我正在使用ARSCNFaceGeometry遮罩节点来移动。我需要一些帮助来实现自定义图像或节点,而不是使用 Apple 的掩码节点。谢谢您的帮助。

var maskNode: Mask?

override func viewDidLoad() {
    super.viewDidLoad()   
    self.sceneView.backgroundColor = .clear
    self.sceneView.scene = SCNScene()
    self.sceneView.rendersContinuously = true
    if let device = MTLCreateSystemDefaultDevice(),
    let geo = ARSCNFaceGeometry(device: device) {
        self.maskNode = Mask(geometry: geo)
        self.sceneView.scene?.rootNode.addChildNode(self.maskNode!)
        self.maskNode?.position = SCNVector3(x: 0.0, y: 0.0, z: 0.0)
        self.maskNode?.isHidden =  true
    }
    let config = ARFaceTrackingConfiguration()
    config.worldAlignment = .gravity
    session.delegate = self
    session.run(config, options: [])
    self.updateUI()
}

面具:

class Mask: SCNNode, VirtualFaceContent {

    init(geometry: ARSCNFaceGeometry) {
        let material = SCNMaterial()
        material.diffuse.contents = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
        geometry.firstMaterial = material
        super.init()
        self.geometry = geometry
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("\(#function) has not been implemented")
    }

    // MARK: VirtualFaceContent

    /// - Tag: SCNFaceGeometryUpdate
    func update(withFaceAnchor anchor: ARFaceAnchor) {
        let faceGeometry = geometry as! ARSCNFaceGeometry
        faceGeometry.update(from: anchor.geometry)
    }
}

虚拟人脸内容:

protocol VirtualFaceContent {
    func update(withFaceAnchor: ARFaceAnchor)
}

typealias VirtualFaceNode = VirtualFaceContent & SCNNode

// MARK: Loading Content

func loadedContentForAsset(named resourceName: String) -> SCNNode {
    let url = Bundle.main.url(forResource: resourceName, withExtension: "scn", subdirectory: "Models.scnassets")!
    let node = SCNReferenceNode(url: url)!
    node.load()
    return node
}

标签: iosswiftarkit

解决方案


您可以使用渲染器(节点:用于锚点:)。Guard 检查锚是否是 ARFaceAnchor,然后将您的自定义几何图形分配给该节点。您也可以将自定义节点添加到为锚添加的 ARKit 节点,由您决定。


推荐阅读