Hi,
I have an ARKit facial tracking app. Whenever I try to load a reference node inside renderer(_:didAdd:for:) I get a SceneKit error on the console.
[SceneKit] Error: Scene <SCNScene: 0x283692c60> is modified within a rendering callback of another scene (<SCNScene: 0x2836943c0>). This is not allowed and may lead to crash
Here's the part of the code that is relevant to this problem.
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor else { return }
currentFaceAnchor = faceAnchor
if node.childNodes.isEmpty, let contentNode = self.renderer(renderer, nodeFor: faceAnchor) {
node.addChildNode(contentNode)
}
}
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
guard anchor is ARFaceAnchor else { return nil }
let refNode = SCNReferenceNode(named: "my_model")
return refNode
}
This setup is similar to the setup on Creating Face-Based AR Experiences sample code, which can be found here. When I run Apple's sample code and view the robot model I do not receive any errors at runtime.
I understand the error and I have a way of fixing it, however what I don't understand is why Apple's sample code doesn't have the same issue. What am I missing here?
By the way the fix is the following:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
DispatchQueue.global().async {
guard let faceAnchor = anchor as? ARFaceAnchor else { return }
self.currentFaceAnchor = faceAnchor
DispatchQueue.main.async {
if node.childNodes.isEmpty, let contentNode = self.loadRefNode() {
node.addChildNode(contentNode)
}
}
}
}
func loadRefNode() -> SCNNode? {
let refNode = SCNReferenceNode(named: "my_model")
return refNode
}
Looking forward to your answers!