0

我是第一次构建 ARkit 项目,我需要做的是,首先,我必须在 ARSCNView 中显示一个 3D Sphere。然后当我单击一个按钮时,球体应该消失并在其位置显示一个 3D 立方体。

我正在考虑我的代码:

 @IBOutlet weak var sceneView: ARSCNView!
    var  objectNode: SCNNode?
    var objectScene: SCNScene?

objectScene = SCNScene(named: "sphere.dae")
objectNode = objectScene!.rootNode
sceneView.scene.rootNode.addChildNode(objectNode!)

这是按钮的代码:

@IBAction func cubeButtonClicked(_ sender: UIButton) {
          sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
            node.removeFromParentNode()
        }
        
        objectScene = SCNScene(named: "cube.dae")    
        objecteNode = objectScene!.rootNode
        sceneView.scene.rootNode.addChildNode(objecteNode!) 
    }
    

我正面临这个错误

[SceneKit] Error: removing the root node of a scene from its scene is not allowed

难道我做错了什么?

4

2 回答 2

1

实际上,该错误准确地说明了导致它的原因。

已编辑---尝试以下两种方法之一

  • 使用以下代码避免删除pointOfView哪个是您的SCNCamera.
sceneView.scene.rootNode.enumerateChildNodes { (node, _) in
    if node == sceneView.pointOfView {return}
    node.removeFromParentNode()
}
  • 如果您只有一个节点要删除,在您的情况下是sphereNode,则无需使用 enumerate 方法。只需保留对该节点的引用,并在需要时删除。
sphereNode.removeFromParentNode()
于 2020-08-17T01:55:18.370 回答
0

我在上面的代码中缺少的是我必须进行删除并添加两个同步任务。由于 Delete 函数进入了闭包(异步任务)。所以添加功能将在删除之前执行。到那时,错误就会消失。

于 2020-08-17T21:47:43.417 回答