swiftarkitrendereraranchor

ARKit: Rendering multiple anchors and nodes in didUpdate method


Trying to update two different nodes in renderer(_ renderer:didUpdate:for:) method for different anchors looks like it let me update only one node, but I needed both: ARFaceAnchor and ARMeshAnchor How can I solve this problem?

// 1
    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor ) {
        if let faceAnchor = anchor as? ARFaceAnchor {
            targetFaceGeometry = faceAnchor.geometry
        }
    }


&

// 2
   func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor ) {
        if let meshAnchor = anchor as? ARMeshAnchor {
            let geometry = createGeometryFromAnchor(meshAnchor: meshAnchor)
            geometry.firstMaterial?.colorBufferWriteMask = [.alpha]
            node.geometry = geometry
        }
    }

Solution

  • You can handle both cases in a single function

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        if let faceAnchor = anchor as? ARFaceAnchor {
            targetFaceGeometry = faceAnchor.geometry
        } else if let meshAnchor = anchor as? ARMeshAnchor {
            let geometry = createGeometryFromAnchor(meshAnchor: meshAnchor)
            geometry.firstMaterial?.colorBufferWriteMask = [.alpha]
            node.geometry = geometry
        }
    }