【问题标题】:Is it possible to change the ARKit scene's object when clicking on a button Swift单击按钮Swift时是否可以更改ARKit场景的对象
【发布时间】:2020-12-05 09:00:31
【问题描述】:

我是第一次构建 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

我做错了吗?

【问题讨论】:

    标签: swift augmented-reality arkit scnscene arscnview


    【解决方案1】:

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

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

    • 使用以下代码避免删除pointOfView,这是您的SCNCamera。
    sceneView.scene.rootNode.enumerateChildNodes { (node, _) in
        if node == sceneView.pointOfView {return}
        node.removeFromParentNode()
    }
    
    • 如果您只有一个节点要删除,在您的情况下是sphereNode,则无需使用枚举方法。只需保留对该节点的引用,并在需要时删除。
    sphereNode.removeFromParentNode()
    

    【讨论】:

    • 感谢您的回答@kevinn-w,但这并不能真正解决我的问题,我仍在寻找解决方案
    • 你好@Elin,你能在我更新的答案中尝试这两种方法吗?
    • 你好@Kevinn W,谢谢你的帮助,我真的找到了我的问题。即:我试图在另一个节点被删除之前添加一个新节点,因为删除函数在一个闭包中,所以它是一个异步任务,这就是为什么我添加了一些代码,所以添加功能将在闭包之后工作完成它的工作。有道理吗?
    • 是的@Elin。您确实需要确保在添加新内容之前删除该节点。我很好奇为什么你必须使用enumerated,你不能在创建新节点之前删除那个节点吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2018-01-06
      • 2021-07-15
      • 2017-08-08
      • 2022-09-25
      • 1970-01-01
      相关资源
      最近更新 更多